문제

나는 하나의 레코드 만 반환하는 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를 살펴보십시오. 이제는 조금 오래되었지만 여전히 좋은 아이디어입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top