Методы объединения рельсов Moching - PullRequest
0 голосов
/ 03 сентября 2011

Вот мой вспомогательный метод, который я хочу протестировать.

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 Ответ

1 голос
/ 03 сентября 2011

Когда ваш вспомогательный метод выполняется, он извлекает собственную ссылку на объект вашего автора, а не @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 ) }

Не очень эффективно, но должно, по крайней мере, получить желаемый результат в том, что данные будут фактически прикреплены к записи.

...