Stubbing: найти на модельный класс - PullRequest
0 голосов
/ 10 марта 2012

Учитывая модель с методом self.fetch_payment_method:

def self.fetch_payment_method
  name = "Omnikassa"
  pm = Spree::PaymentMethod.find(:first, :conditions => [ "lower(name) = ?", name.downcase ]) || raise(ActiveRecord::RecordNotFound)
end

И тест rspec для проверки этого:

it 'should find a payment_method' do
  Spree::PaymentMethod.new(:name => "Omnikassa").save
  @omnikassa.class.fetch_payment_method.should be_a_kind_of(Spree::PaymentMethod)
end

Я хотел бы улучшить это, так что это делаетне проверять весь стек и базу данных.Для этого я просто хотел бы заглушить ": найти" при вызове класса Spree::PaymentMethod.Однако:

it 'should find a payment_method' do
  Spree::PaymentMethod.any_instance.stub(:find).and_return(Spree::PaymentMethod.new)
  @omnikassa.class.fetch_payment_method.should be_a_kind_of(Spree::PaymentMethod)
end

Не работает.Я довольно новичок во всем, что касается BDD / TDD, а заглушки и издевательства все еще являются чем-то магическим для меня;так что я, скорее всего, неправильно понимаю, что именно делает заглушка и возвращение.

Как мне заглушить SomeActiveRecordModel.find?

1 Ответ

4 голосов
/ 10 марта 2012

Вы все делаете правильно, за исключением того, что метод заглушки должен вызываться для самого класса Spree::PaymentMethod, а не для его экземпляров

И обычной практикой является возвращать определенный экземпляр с этой заглушкой, а неновый:

it 'should find a payment_method' do
  payment_meth = mock_model(Spree::PaymentMethod)
  Spree::PaymentMethod.stub!(:find).and_return(payment_meth)

  @omnikassa.class.fetch_payment_method.should be_equal(payment_meth)
end

И, кстати, где вы инициализируете объект @omnikassa?

...