2014-01-16 3 views
20

Я пишу блок-тест с использованием rspec.mock Rails.env.development? using rspec

Я хотел бы высмеять Rails.env.develepment? для возврата true. Как я мог это достичь?

Я попытался это

Rails.env.stub(:development?, nil).and_return(true) 

он выдает эту ошибку

activesupport-4.0.0/lib/active_support/string_inquirer.rb:22:in `method_missing': undefined method `any_instance' for "test":ActiveSupport::StringInquirer (NoMethodError) 

Update рубин версия рубин-2.0.0-P353, рельсы 4.0.0, Rspec 2,11

describe "welcome_signup" do 
    let(:mail) { Notifier.welcome_signup user } 

    describe "in dev mode" do 
     Rails.env.stub(:development?, nil).and_return(true) 
     let(:mail) { Notifier.welcome_signup user } 
     it "send an email to" do 
     expect(mail.to).to eq([GlobalConstants::DEV_EMAIL_ADDRESS]) 
     end 
    end 
    end 

ответ

15

Вы должны заглушить в it, let, before блоков. Переместить код там, и он будет работать

И этот код работает в моих тестах (возможно, ваш вариант может работать как хорошо)

Rails.env.stub(:development? => true) 

, например

describe "in dev mode" do 
    let(:mail) { Notifier.welcome_signup user } 

    before { Rails.env.stub(:development? => true) } 

    it "send an email to" do 
    expect(mail.to).to eq([GlobalConstants::DEV_EMAIL_ADDRESS]) 
    end 
end 
+1

на самом деле не помогло. получение 'method_missing ': undefined method' stub' для "test": ActiveSupport :: StringInquirer (NoMethodError) – ssinganamalla

+0

странно - я проверил в своих тестах перед отправкой кода. Предоставьте свой код и версии драгоценных камней (rails, rspec) – gotva

+0

добавлено в качестве обновления – ssinganamalla

42

Существует гораздо лучший способ Описанная здесь: https://stackoverflow.com/a/24052647/362378

it "should do something specific for production" do 
    allow(Rails).to receive(:env) { "production".inquiry } 
    #other assertions 
end 

Это обеспечит все функции л ike Rails.env.test?, а также работает, если вы просто сравниваете строки как Rails.env == 'production'

+1

Это RSpec 3 способ сделать это. –

+12

Чистый способ получить объект запроса - это сделать '' production '. Query' –

+0

@DavidBackeus: Я не согласен, я считаю, что метод Rails для загрязняющих объектов с неродственным поведением не чист, но он определенно удобен. Спасибо – iGEL