2011-09-03 6 views
0

다음은 테스트하고 싶은 도우미 메서드입니다.이동 레일 연결 방법

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 '[email protected]' 
    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>' 

그리고 모든 문제는 모카 정말 저자의 글의 카운트 값을 조롱하지 않는다는 것입니다, 그리고이 일을 더 나은 방법이 있습니까 0 대신

(40)의 반환 @author.posts.expects(:count).returns(40)은?

+0

어떻게하면 : author.stubs (: posts) .returns (스텁 (: 개수 => 40))'. 즉, stub_chains는 Rspec에서 훨씬 더 잘 처리됩니다. – apneadiving

답변

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) } 

대단히 효율적이지,하지만 적어도 데이터가 실제로 첨부됩니다 점에서 원하는 결과를 얻어야한다 그 기록.

+0

그래, 작동합니다. 하지만 데이터베이스에 40 개의 추가 레코드를 만들지 않고 모카로 더 많은 작업을 수행하고 싶습니다. 방법이 있습니까? – Adam

+0

필자는이 줄을 필자의 테스트'User.expects (: find_by_name) .with (anything) .returns (@author)'에 추가하려고 시도했지만 통과하지는 못했습니다. – Adam

+0

@ author.posts를 호출 할 때 게시물은 테스트에서 조롱 된 것과 다른 개체가 될 것이기 때문입니다. 어떤 것을 조롱 할 필요가 있다면 posts 객체에 대한 호출을 조롱하는 대신'@ author.expects (: posts) .returns ([ 'dummy'] * 40)'와 같은 모의 게시물 객체를 @author에게 준다. – Chris