【问题标题】:How to stub DataMapper association with RSpec2?如何存根 DataMapper 与 RSpec2 的关联?
【发布时间】:2011-10-28 19:44:28
【问题描述】:

我正在尝试编写一些规范,并希望删除对数据库的调用,因此我不依赖实际填充的数据库来运行测试。

现在我真的不知道如何使用 DataMapper 对关联之间的调用进行存根。

以下是两个示例模型:

class Foo
  include DataMapper::Resource

  property :id, Serial

  has n, :bars
end

class Bar
  include DataMapper::Resource

  property :id, Serial

  belongs_to :foo
end

现在我想将呼叫存根到 Foo.first('foobar')Foo.first('foobar').bars 第一个使用Foo.stub(:first) { #etc } 没有问题,但我不知道如何存根对其关联的第二次调用。 Foo.stub(:bars) { #etc } 之类的东西不起作用。

有人知道怎么做吗?这种方法是否正确?

提前致谢。

【问题讨论】:

    标签: ruby testing datamapper rspec2 stub


    【解决方案1】:

    我会使用 mock_model。

    foo = mock(Foo).as_null_object
    foo.stub(:bars)
    Foo.stub(:first).and_return(foo)
    

    使用 as_null_object 的原因是,当 RSpec 被问及它是否重新分配到一个没有被告知期望的方法时,默认情况下会返回 false。

    如果这不起作用,则创建一个 foo 的实例。

    foo = Foo.create(:example => "data") #Or create with a factory a factory
    foo.stub(:bars)
    Foo.stub(:first).and_return(foo)
    

    那么当你这样做时:

    Foo.first('foobar').bars
    

    它将使用第 2 行的存根,因为第一次调用将返回该 foo 实例。

    【讨论】:

      【解决方案2】:

      未经测试,但应该可以工作:

      Foo.stub(:first) { ... }
      foo = Foo.first('foobar')
      foo.stub(:bars) { ... }
      

      问候,

      一个。

      【讨论】:

        【解决方案3】:

        你可以使用stub_chain方法:

        Foo.stub_chain(:first, :bars).and_return(:whatever)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-22
          • 2013-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多