0

rspec 新手,想知道如何为 validates_associated 编写期望。

post.rb

class Post
  validates_associated :user
end

post_spec.rb

it 'must belong to a user' do
  post = build(:post, user: nil)
  expect(post).to have(1).errors_on(:user)
end

但是,这不起作用,检查 error_on(:user_id) 也不起作用

4

2 回答 2

1
class Post
  validates_associated :user
end

class User
  validates :name, presence:true
end

验证与示例相关的实际方法

post = Post.find 1

post.title = "something"
post.user.name =  nil

post.save => false

它返回 false,因为关联用户无效,因为用户名不存在。

要对其进行测试,您应该:

it 'validates associated user' do
  post = build(:post)
  post.user.build(:name => nil)
  post.save.should == false
  post.user.errors.should == {:name => [name must be present]} // something like this
end
于 2013-06-29T06:22:32.233 回答
0

有很多方法可以使用 RSpec,特别是考虑到最近从shouldtoexpect方法的转变。在这个答案中,我将尝试回答为什么您的测试无法按原样运行,假设使用这些特定参数调用的 build 确实会引发您所说的错误。换句话说,我会尽量回应你的测试形式。

首先,我不确定你的陈述是什么意思post = build(...)。如果您打算在那时实际执行build 方法并且您希望 build 的执行失败,那将导致您的测试失败。要测试错误的引发,您需要将引发错误的代码传递给 RSpec 并让 RSpec 调用它。通常,您希望在执行被测代码之前设置期望值。

如果您希望post = build(...)将其定义post为调用构建的函数,那么这不是正确的语法。如果你想使用这种方法,你必须说post = lambda {build(...)}. 这将允许该expect方法执行post并检查它引发的错误。

或者,您可以直接传递一个块来期望,如下所示:

expect{build(...)}.to ...

有关更多示例,请参阅https://www.relishapp.com/rspec/rspec-expectations/v/2-0/docs/matchers/expect-error

于 2013-06-29T17:32:03.593 回答