web-dev-qa-db-ja.com

Rails.env.developmentのモック? rspecを使用する

私は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)

アップデートRubyバージョン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
26
ssinganamalla

itletbeforeブロックでスタブする必要があります。コードをそこに移動すると、機能します

そして、このコードは私のテストで機能します(おそらくあなたのバリアントも機能する可能性があります)

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
16
gotva

ここで説明されているはるかに良い方法があります: https://stackoverflow.com/a/24052647/362378

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

これにより、Rails.env.test?のようなすべての関数が提供され、Rails.env == 'production'のような文字列を比較するだけでも機能します。

56
iGEL