Moching rails关联方法

时间:2011-09-03 13:28:39

标签: ruby-on-rails factory-bot mocha testunit

这是我想要测试的辅助方法。

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)

1 个答案:

答案 0 :(得分:1)

当你的助手方法运行时,它会检索你自己的对象的对象引用,而不是测试中定义的@author。如果你在帮助方法中遇到puts @author.object_idputs author.object_id,你会看到这个问题。

更好的方法是将作者的设置数据传递到模拟记录,而不是设置对测试对象的期望。

我使用FactoryGirl已经有一段时间了,但我认为这样的事情应该有效:

@author = FactoryGirl.create(:user, name: 'Jason')
(1..40).each { |i| FactoryGirl.create(:post, user_id: @author.id ) }

效率不是很高,但至少应该得到理想的结果,因为数据实际上会附加到记录中。