Rails Rspec Model Spec用户:email ActiveRecord :: RecordInvalid

时间:2012-08-07 21:55:54

标签: ruby-on-rails ruby rspec

试图找出我的rspec测试失败的原因。最值得注意的是看似矛盾的失败消息。声明我有一个ActiveRecord :: RecordInvalid错误,这正是我所声称应该发生的事情。

这是我的user.rb

...
validates_presence_of :email
...

这是我的users_spec.rb

...
it "is invalid without email" do 
  Factory(:user, email: nil).should raise_error(ActiveRecord::RecordInvalid)
end
...

这是输出:

Failures:

  1) User a user (in general) is invalid without email
     Failure/Error: Factory(:user, email: nil).should raise_error(ActiveRecord::RecordInvalid)
     ActiveRecord::RecordInvalid:
       Validation failed: Email is invalid, Email can't be blank
     # ./spec/models/user_spec.rb:34:in `block (3 levels) in <top (required)>'

最初我是用这种方式测试的,但是它一直没能用,所以我决定指出我期待的错误。

it "is invalid without email" do 
  Factory(:user, email: nil).should_not be_valid
end

1 个答案:

答案 0 :(得分:8)

您的代码无效的原因是您在实际测试其有效性之前尝试创建无效模型。你想要做的是创建一个有效的模型,改变一些东西并检查它是否无效,如下所示:

it "is invalid without email" do 
  user = Factory(:user)
  user.email = nil
  user.should_not be_valid
end

我个人喜欢在before块中定义我的模型,设置为subject,然后更改每个规范中的属性并检查有效性,如下所示:

before do
  @user = FactoryGirl.create(:user)
end

subject { @user }

it "is invalid without email" do
  subject.email = nil
  should_not be_valid
end

对于记录,如果你想测试记录创建引发了一个错误(肯定不是这样做的可行方法),你可以通过包装{{1}来做到这一点。在Factory中调用,如下所示:

lambda