RSPEC를 사용하여 체인 스터 링 방법
-
21-08-2019 - |
문제
나는 하나의 레코드 만 반환하는 named_scope를 호출하고 싶지만, named_scope는 배열을 반환합니다..
Model.named_scope(param).first
그리고 이것은 제가 어려움을 겪고있는 것은 체인 된 호출을 스텁하는 방법입니다. RSPEC 조롱으로 이것을 달성하는 방법에 대한 참조 나 답변이 있습니까?
해결책
나는 무언가를 알아 냈다.
Client.stub!(:named_scope).and_return(@clients = mock([Client]))
@clients.stub!(:first).and_return(@client = mock(Client))
컨트롤러를 호출 할 수 있습니다.
@client = Client.named_scope(param).first
작동하지만 더 나은 솔루션이 있습니까?
편집하다:
RSPEC 1.2.6의 출시를 통해 STUB_CHAIN을 사용할 수 있습니다.
Client.stub_chain(:named_scope, :chained_call).and_return(@clients = [mock(Client)])
항상 API를 구체적으로 확인 하듯이 이것은 내 머리 위로였습니다. :)
다른 팁
더 나은 버전
Client.stub!(:named_scope).and_return(@clients = mock([Client]))
@clients.stub!(:first).and_return(@client = mock(Client))
될거야:
Client.should_receive(:named_scope).with(param).and_return do
record = mock_model(Comm)
record.should_receive(:do_something_else)
[record]
end
문제는 상당히 오래되었으므로 스터 빙을 수행 할 수있는 방법에 대한 개선 사항이 거의 없습니다. 이제 stub_chain 메소드를 사용하여 메소드 호출 체인을 스텁 할 수 있습니다. 예를 들어:
@client = Client.named_scope(param).first
다음과 같이 스터브 될 수 있습니다.
Client.stub_chain(:named_scope,:first).and_return(@client = mock(Client))
stub_chaining의 더 많은 예 :
describe "stubbing a chain of methods" do
subject { Object.new }
context "given symbols representing methods" do
it "returns the correct value" do
subject.stub_chain(:one, :two, :three).and_return(:four)
subject.one.two.three.should eq(:four)
end
end
context "given a string of methods separated by dots" do
it "returns the correct value" do
subject.stub_chain("one.two.three").and_return(:four)
subject.one.two.three.should eq(:four)
end
end
end
rspecs를 오래 산다 !!! :)
이것이 컨트롤러 사양에 있다고 생각합니까?
자신의 제안은 잘 작동해야합니다. 또 다른 가능성은 문제를 완전히 피하기 위해 모델 내부의 named_scope 호출을 이동하는 것입니다. 이것은 또한 "지방 모델, 얇은 컨트롤러"조언과 일치합니다.
쿼리를 재사용 할 수있는 이름의 범위에 넣어 이미 얇은 컨트롤러를 수행했다고 생각합니다. 다음은 이름이 지정된 스코프를 사용하기 전에 사용한 코드입니다.
def mock_comm(stubs={})
@mock_comm ||= mock_model(Comm, stubs)
end
describe "responding to GET index" do
it "should expose all comms as @comms" do
Comm.should_receive(:find).with(:all).and_return([mock_comm])
get :index
assigns[:comms].should == [mock_comm]
end
# ...
나는 아마도 당신이 이미 가지고있는 것과 매우 유사한 코드를 작성할 것이지만, 아마도 그것을 재사용 할 수있는 도우미에 넣을 수도 있습니다. 다른 것은 더 많은 제어를 제공하는 다른 조롱 프레임 워크를 사용하는 것입니다. RSPEC에서 Ryan Bates의 RailScast를 살펴보십시오. 이제는 조금 오래되었지만 여전히 좋은 아이디어입니다.