我遵循这种模式
it { is_expected.to respond_to(:cars) }
用于检查关联
现在意外地在模型中,让我们假设我有这条线
has_many :bars
所以在测试中,看到模型后。我继续做了这个
it { is_expected.to respond_to(:bars) }
测试通过,但没有模型Bar
我们如何纠正这个问题。
答案 0 :(得分:1)
has_many :bars
为您的模型添加了许多方法,bars
就是其中之一,而respond_to
匹配器只是检查是否有这样的公开方法 - 所以你没有真正测试你的认为你想测试。
你可以这样做:
expect(subject.bars.build).to be_instance_of(Bar)
如果Bar
不存在,此规范将失败。
我也很确定
expect(subject.bars).to eq []
也会失败,因为它应该尝试在数据库中找到那些,并且缺少的模型也会出现在这里。
也是这个
expect{ subject.bars.build }.not_to raise_exception
也应该失败。
这通常是动态语言的问题 - 错误(包括错别字)不会立即被捕获。
我实际上并不知道你可以定义与未成熟模型的关系。但这是有道理的 - 检查类定义中的类是否存在可能有点太重了。
答案 1 :(得分:0)
我有几个部分的答案。首先,您可以通过测试驱动您的实现来帮助避免这些错误的错误。如果你先写一个失败的测试,错误信息是你认识错字的另一个机会:“等等,一分钟......回复bars
是没有意义的。这不是我的意思意味着......“
更大的答案是,这个测试本身没什么价值而没有价值。如果你在实现和测试中都输入了上面的拼写错误而没有其他测试失败那么如果对象响应cars
,{{1}那么我很难相信它很重要或者任何其他错字。
更有价值的测试会行使协会的行为。例如,如果您想测试bars
是否可以将Person
与其用户相关联,则可以从执行该功能的功能测试开始。测试失败将指导您实现可能需要或可能不需要该关联的工作实现。但是,如果你输入了关联,你会发现它是因为你正在测试实际行为。