这是我想要测试的辅助方法。
def posts_correlation(name)
if name.present?
author = User.find_by_name(name)
author.posts.count * 100 / Post.count if author
end
end
用户工厂。
factory :user do
email 'user@example.com'
password 'secret'
password_confirmation { password }
name 'Brian'
end
最后一次永久失败的测试。
test "should calculate posts count correlation" do
@author = FactoryGirl.create(:user, name: 'Jason')
@author.posts.expects(:count).returns(40)
Post.expects(:count).returns(100)
assert_equal 40, posts_correlation('Jason')
end
喜欢这个。
UsersHelperTest:
FAIL should calculate posts count correlation (0.42s)
<40> expected but was <0>.
test/unit/helpers/users_helper_test.rb:11:in `block in <class:UsersHelperTest>'
整个问题是mocha并没有真正模仿作者帖子的计数值,而是返回0而不是40。
有没有更好的方法:@author.posts.expects(:count).returns(40)
?
答案 0 :(得分:1)
当你的助手方法运行时,它会检索你自己的对象的对象引用,而不是测试中定义的@author。如果你在帮助方法中遇到puts @author.object_id
和puts author.object_id
,你会看到这个问题。
更好的方法是将作者的设置数据传递到模拟记录,而不是设置对测试对象的期望。
我使用FactoryGirl已经有一段时间了,但我认为这样的事情应该有效:
@author = FactoryGirl.create(:user, name: 'Jason')
(1..40).each { |i| FactoryGirl.create(:post, user_id: @author.id ) }
效率不是很高,但至少应该得到理想的结果,因为数据实际上会附加到记录中。