3

试图找出我的 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
4

1 回答 1

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

作为记录,如果您想测试记录创建是否引发了错误(这绝对不是这样做的可取方法),您可以通过将Factory调用包装在 a 中来做到这一点lambda,如下所示:

lambda {
    Factory(:user, :email => nil)
}.should raise_error(ActiveRecord::RecordInvalid)
于 2012-08-07T22:19:41.423 回答