2010-12-07 4 views
31

rspec에서 find_each 호출을 테스트하는 방법이 궁금합니다.레일에서 rspec 테스트를 위해 find_each를 스터필 할 수 있습니까?

: 다른 클래스에서 나는이 일을 해요,

MyClass.stub(:find).and_return(my_mock) 

그러나 : 나는 단순히 내 모델 그래서 나는이 같은 DB에 테스트 데이터에 의존하지 않는 반환 할 것을 스텁 사용 해요 사양 시험에서

MyClass.stub(:find_each).and_return([one_mock, two_mock]) 

은 "여기 물건을 할"부분이 실행되지 않는 :

MyClass.find_each do |instance_of_my_class| 
    do_stuff_here_on(instance_of_my_class) 
end 

은 내가 이렇게하면 것을 찾을 수 있습니다. 누구든지 rspec 테스트를 위해 find_each를 스텁하는 방법을 알고 있습니까?

답변

35

당신은 모의에 전달 된 블록 전화 RSpec에 할 and_yield 사용할 수 있습니다

MyClass.stub(:find_each).and_yield(one_mock).and_yield(two_mock) 
+0

이렇게하면 다음 오류가 발생합니다. 1의 진리를 가지고 블록하라. mock을 배열로 전달하면 문제가 없지만 find_each 블록의 instance_of_my_class는 배열이고 그 안에있는 요소는 아니다. – Aaron

+4

'.and_yield (one_mock) .and_yield (two_mock) '는 어떻습니까? – zetetic

+0

당신은 꽤 옳습니다, zetetic - 나는 다음 번에 내 충고를 테스트 할 것입니다 :) 당신의 교정 내용을 포함하도록 제 대답을 편집했습니다. – Iain

2

메서드를 스텁하는 전체 지점에서 메서드가 예상 값을 반환하고 해당 내용을 실행하지 않도록합니다. find_each 메소드 내에 많은 로직을 가지고 있다면, 별도의 메소드로 이동하고 별도로 로직을 테스트 할 것을 권장합니다. 그런 다음 실행 중에 메소드가 호출되는지 테스트 할 수 있습니다.

class Example1 
    def my_method 
    # some logic 
    end 
end 

class Example2 
    def my_other_method 
    Example1.find_each(&:my_method) 
    end 
end 

RSpec에 :

describe Example1 do 
    it "should return something" do 
    example = Example1.new 
    example.my_method.should == something 
    end 
end 

describe Example2 do 
    it "should call my_method on Example1" do 
    example1 = mock(:example1, :my_method => true) 
    example2 = Example2.new 

    example1.should_receive(:my_method) 
    example2.my_other_method 
    end 
end 
+0

. 이를 반영하기 위해 find_each 블록을 업데이트했습니다. 나는 패스하는 모든 mocks에서이 작업을 수행하는지 테스트하려고합니다. – Aaron

1

이를

여기에 꽤 높은 수준의 예입니다 해야합니다 :

MyClass.stub(:find_each) {|block| 
    block.call 
    [one_mock, two_mock] 
} 

do_stuff_here_on에 전역 적으로 연결할 수 없습니다. some_object에서 인스턴스 메서드, 당신은 블록에 적합한 범위를 얻기 위해 몇 가지 instance_eval 필요합니다 : 나는 실제로 내가 테스트하고있어 다른 방법으로 논리를하고 있어요

MyClass.stub(:find_each) {|block| 
    some_object.instance_eval(&block) 
    [one_mock, two_mock] 
} 
관련 문제