Rspec测试未能显示该模型需要电子邮件

时间:2016-04-05 12:20:06

标签: ruby unit-testing ruby-on-rails-4 rspec

我(大多数情况下)正在按照教程everydayrails.com尝试编写一个测试,该测试显示我的用户模型需要电子邮件:

 17   it "requires an email" do
 18     user = FactoryGirl.create(:user, email: nil)
 19     expect( user ).to_not be_valid
 20   end

但这失败了...因为我的用户模型需要电子邮件?

Failures:

  1) User requires an email
     Failure/Error: user = FactoryGirl.create(:user, email: nil)

     ActiveRecord::RecordInvalid:
       Validation failed: Email can't be blank
     # ./spec/models/user_spec.rb:18:in `block (2 levels) in <top (required)>'

我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

您对Factory.create的调用会运行验证,默认情况下,内部工厂女孩会使用save!,因此失败的验证会导致异常被引发。

使用Factory.build代替(如您链接到的教程中)创建一个可以测试有效性的未保存对象

答案 1 :(得分:0)

你可以这样试试这个测试

it "requires an email" do
  expect(User.new.errors_on(:email)).to include("can't be blank")
end

expect(Factory.build(:user, email: nil)).to_not be_valid

有关详情请参阅errors_on

答案 2 :(得分:0)

将来在编写测试时我会建议的关键事项是:

  • 可读即可。测试应该真的易于阅读(和写)。
  • 广泛即可。测试不应该不必要地破坏,并且应该测试你需要它的确切内容。

您正在寻找的代码示例是:

context "Email address" do
  it 'does not validate if email is nil' do
    user_with_no_email = build(:user, email: nil)

    expect(user_with_no_email).to receive(:validate).with(false)
    expect(user_with_no_email).to have(1).error_on(:email)
  end
end