开发者

Moching rails association methods

Here is my helper method which I want to test.

def posts_correlation(name)    
  if name.present?      
    author = User.find_by_name(name)
    author.posts.count * 100 / Post.count if author  
  end
end

A factory for user.

factory :user do
  email 'user@example.com'
  password 'secret'
  password_confirmation { password }
  name 'Brian'    
end

And finally a test which permanently fails.

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

Like this.

UsersHelperT开发者_运维知识库est:
  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>'

And the whole problem is that mocha doesn't really mock the count value of author's posts, and it returns 0 instead of 40.

Are there any better ways of doing this: @author.posts.expects(:count).returns(40) ?


When your helper method runs, it's retrieving its own object reference to your author, not the @author defined in the test. If you were to puts @author.object_id and puts author.object_id in the helper method, you would see this problem.

A better way is to pass the setup data for the author in to your mocked record as opposed to setting up expectations on the test object.

It's been a while since I used FactoryGirl, but I think something like this should work:

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

Not terribly efficient, but should at least get the desired result in that the data will actually be attached to the record.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜