Как протестировать метод смешанного класса, вызываемый с помощью RSpec и Mocha?

У меня есть модуль:

module MyModule
  def do_something
    # ...
  end
end

используется классом следующим образом:

class MyCommand
  extend MyModule

  def self.execute
    # ...
    do_something
  end
end

Как мне убедиться, что MyCommand.execute звонит do_something? Я пробовал частичное издевательство над мокко, но оно не терпит неудачу, когда do_something не вызывается:

it "calls do_something" do
  MyCommand.stubs(:do_something)
  MyCommand.execute
end

person Sébastien Le Callonnec    schedule 15.05.2013    source источник


Ответы (2)


Что ж, это одно решение.

Как я уже упоминал в этот SO post, есть две стратегии насмешки/заглушки:

1) Использование expects мокко будет автоматически подтверждено в конце вашего теста. В вашем случае это означает, что если MyCommand.execute не вызывается после expects его выполнения, тест завершится ошибкой.

2) Более конкретный/напористый способ сделать это — использовать комбинацию заглушек и шпионов. Заглушка создает фальшивый объект с указанным вами поведением, а затем шпион проверяет, не вызывал ли кто-нибудь этот метод. Чтобы использовать ваш пример (обратите внимание, что это RSpec):

require 'mocha'
require 'bourne'

it 'calls :do_something when .execute is run' do
  AnotherClass.stubs(:do_something)

  MyCommand.execute

  expect(AnotherClass).to have_received(:do_something)
end

# my_command.rb
class MyCommand
  def self.execute
    AnotherClass.do_something
  end
end

Таким образом, строка expect использует сопоставитель bourne, чтобы проверить, был ли вызван :do_something в `MyCommand.

person adarsh    schedule 16.05.2013

Хорошо, похоже, что expects — это решение:

it "calls do_something" do
  MyCommand.expects(:do_something)
  MyCommand.execute
end
person Sébastien Le Callonnec    schedule 15.05.2013
comment
только что задал тот же вопрос, могу подтвердить, что этот ответ позволяет мне точно определить ожидание вызова метода класса - person 1ijk; 22.04.2015