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

bot*_*bot 3 ruby rspec ruby-on-rails

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

这是我的user.rb

...
validates_presence_of :email
...
Run Code Online (Sandbox Code Playgroud)

这是我的users_spec.rb

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

这是输出:

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)>'
Run Code Online (Sandbox Code Playgroud)

最初我是以这种方式测试它但是它一直都失败了,所以我决定指出我期待的错误.

it "is invalid without email" do 
  Factory(:user, email: nil).should_not be_valid
end
Run Code Online (Sandbox Code Playgroud)

Chr*_*erg 8

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

it "is invalid without email" do 
  user = Factory(:user)
  user.email = nil
  user.should_not be_valid
end
Run Code Online (Sandbox Code Playgroud)

我个人喜欢在一个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
Run Code Online (Sandbox Code Playgroud)

对于记录,如果你想测试记录创建引发了一个错误(绝对不是这样做的可行方法),你可以通过将Factory调用包装在一个lambda,如下所示:

lambda {
    Factory(:user, :email => nil)
}.should raise_error(ActiveRecord::RecordInvalid)
Run Code Online (Sandbox Code Playgroud)