Подтвердить что ты не робот

Mock Rails.env.development? используя rspec

Я пишу unit test с помощью 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 рубиновая версия ruby-2.0.0-p353, rails 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
4b9b3361

Ответ 1

Вы должны зайти в блоки 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

Ответ 2

Здесь намного лучший способ: fooobar.com/info/167993/...

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

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