Rspec和FactoryGirl.attributes_for params重构

时间:2014-01-24 00:37:10

标签: ruby-on-rails unit-testing rspec factory-bot

我目前正在通过测试,但我想知道是否可以使用let(:message)或某种变量重构测试

梅勒测试

 describe "Contact Form" do                                                                                                                         

    context "when a valid message" do                                                                                                                

      it "sends an email" do                                                                                                                         
        post contact_create_path, message: FactoryGirl.attributes_for(:message)                                                                      
        expect(ActionMailer::Base.deliveries.last.to).to eq(["#{ENV["MVP_USERNAME"]}"])                                                              
      end                                                                                                                                            
    end     

我要重构的部分是message: FactoryGirl.attributes_for(:message)。 我试着做像

这样的事情
context "when a valid message" do
    let(:message) { FactoryGirl.attributes_for(:message) }        
    it "sends an email" do                                                                                                                         
      post contact_create_path, message                                                                      
      expect(ActionMailer::Base.deliveries.last.to).to eq(["#{ENV["MVP_USERNAME"]}"])                                                              
    end 

但是那个输出 ActionController::ParameterMissing: param not found: message

其他尝试

@message = FactoryGirl.attributes_for(:message)

message = FactoryGirl.attributes_for(:message)

我可以这样离开,但我觉得我应该因为某些原因而改变它。建议?

1 个答案:

答案 0 :(得分:0)

它看起来并不需要重构,但问题是你的let语句中的版本只是属性的哈希。它缺少:message密钥。

let(:message) { message: FactoryGirl.attributes_for(:message) }

这应该有效,但正如我所说,我认为你不需要重构它。我实际上只是确保您将FactoryGirl语法方法混合到您的规范中,这样您就可以放弃FactoryGirl并直接使用attributes_for

在您的规范助手中:

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end