【发布时间】:2015-11-26 12:01:33
【问题描述】:
在某些情况下,我的规范总是返回为真,从而使测试变得多余...
以Achievement 模型为例:
class Achievement < ActiveRecord::Base
has_many :stages
def call_name_method
name
end
def name
key
end
end
# for simplicity sake, I'm just testing a method which simply calls another method.
achievement_specs.rb
require 'rails_helper'
describe Achievement do
describe '#call_name_method' do
subject { achievement.call_name_method }
let(:achievement) { create(:achievement) }
it 'calls #name' do
expect(achievement).to receive(:name)
subject
end
end
end
这个测试成功了,但是我可以把它改成expect(achievement).to receive(:foobar),它仍然会成功,虽然我没有调用foobar。
根据this answer,这是正确的语法,但它永远不会失败。这是一个错误吗?
我也尝试过使用.to have_received(:call_name_method),但这会导致这个错误:
1) 成就#call_name_method 调用#name 失败/错误:expect(achievement).to have_received(:call_name_method) # 预计会收到 call_name_method,但该对象不是间谍或方法尚未被存根。
【问题讨论】:
-
achievement.stages 是一个关系; Stage 也没有方法
register!。你到底想测试什么? -
我想测试Achievement的
register!方法是否在它的stage上调用了register!方法,我用它的方法添加了Stage模型 -
主题{成就.call_name_method}的成就是什么?是否需要覆盖下一行的成就?
-
成就是一个工厂,它确实在“是”之后定义了行。我也可以换线,没有区别
-
代码看起来不错。错误必须在其他地方。如果您提供了一个我们可以运行的最小示例,那就完美了。
标签: ruby-on-rails rspec