Как заглушить связь DataMapper с RSpec2? - PullRequest
3 голосов
/ 17 августа 2011

Я пытаюсь написать некоторые спецификации и хочу отложить вызовы к базе данных, чтобы я не полагался на фактически заполненную базу данных для запуска тестов.

Теперь я не оченьзнать, как заглушить вызовы между ассоциациями с помощью 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 } не работает.

Кто-нибудь знает, как это сделать?Является ли этот подход даже правильным?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 04 сентября 2011

Я бы использовал 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.

0 голосов
/ 06 сентября 2011

Вы можете использовать stub_chain метод:

Foo.stub_chain(:first, :bars).and_return(:whatever)
0 голосов
/ 01 сентября 2011

не проверено, но должно работать:

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

С уважением,

A.

...