我(大多数情况下)正在按照教程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)>'
我在这里做错了什么?
答案 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