我想调用一个只返回一个记录的named_scope,但是named_scope返回一个数组,这不是什么大问题,因为我可以将它与.first链接起来:

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

存根链接的更多示例:

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

或者请看一下:

rspec万岁!!!:)

我想这是在控制器规格?

您自己的建议应该可以正常工作。另一种可能性是移动电话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
# ...

我可能会写代码非常相似,你有什么了,但也许把它放在一个帮手,让我重新使用。另一件事是使用不同的模拟框架,或许给你更多的控制。看看Ryan Bates的上RSpec的railscast - 它现在是有点老,但仍处于有一些好的想法

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top