나는 receive_message_chain의 RSpec에와 이상한 문제가 3.6수없는
allow_any_instance_of(Order).to receive_message_chain('line_items.find')
{LineItem.first}
나는 그것이 나에게없는 <Double (anonymous)>
개체를 반환 컬렉션을 반환하는 대신 order.line_items을 수행 할 때 내가 원한거야.
제안 사항
나는 receive_message_chain의 RSpec에와 이상한 문제가 3.6수없는
allow_any_instance_of(Order).to receive_message_chain('line_items.find')
{LineItem.first}
나는 그것이 나에게없는 <Double (anonymous)>
개체를 반환 컬렉션을 반환하는 대신 order.line_items을 수행 할 때 내가 원한거야.
제안 사항
RSpec에 특정 객체에 receive_message_chain('line_items.find')
을 설정한다고 말하면 체인이 작동하는 올바른 스텁을 설정해야합니다.
첫 번째 RSpec은 객체에 line_items
메소드를 stub합니다. 다음으로 메소드 find
을 스터핑해야하지만이 메소드는 메소드 line_items
의 리턴 값에 스터브되어야합니다. 우리가 그 방법을 고집 한 이래로, RSpec은 스터 빙의 목표가 될 수있는 약간의 반환 값을 제시해야합니다.
그래서 RSpec은 line_items
메서드의 반환 값을 find
스텁이있는 익명 double로 설정합니다. 이 때문에 을 'line_items.find'
으로 설정하면 line_items
이 호출 될 때 개체는 항상 익명의 double을 반환합니다. 그리고 allow_any_instance_of
을 사용했기 때문에 line_items
메소드가 Order
의 모든 인스턴스에 스텁되었습니다.
allow_any_instance_of
및 receive_message_chain
의 사용을 가능한 경우 제거하는 것이 좋습니다. 실제로 코드의 디자인을 변경할 수없는 경우 사양에 사용되는 바로 가기이므로 사용하는 것이 좋습니다. https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/message-chains
그러나 이것이 가능하지 않은 경우 receive_message_chain
을 제거하고 체인을 직접 설정할 수 있습니다.
line_items_stub = double
# or line_items_stub = Order.new.line_items
# or line_items_stub = [LineItem.new, LineItem.new]
# or line_items_stub = the object that you want
allow_any_instance_of(Order).
to receive(:line_items).
and_return(line_items_stub)
allow(line_items_stub).to receive(:find)
는 제거 할 수 있었다 경우
allow_any_instance_of
당신은 당신이에 message_chain 스텁되는 구체적인 예에 line_items의 실제 구현을 위해 전화를
and_call_original
를 사용할 수 있습니다.
은 많은 의미가 있습니다. – sethi
시험 할 RSpec 및 코드는 무엇입니까? 무슨 일이 일어날 것이며 실제로 무엇이 일어나고 있습니까? –
일사량에 문제가 있습니다. receive_message_chain ('a.b.c') 이후에는 더 이상 a.b.d를 사용할 수 없습니다. @JagdeepSingh – sethi