Как проверить методы модуля ruby ​​с блоком, используя Rspec? - PullRequest
0 голосов
/ 12 октября 2018

Я хочу протестировать следующий метод, который вызывает метод модуля с блоком. Структура

def test_target
  MyModule.send do |payload|
    payload.my_text = "payload text"
  end
end

MyModule выглядит следующим образом.

module MyModule
  class Payload
    attr_accessor :my_text

    def send
      # do things with my_text
    end
  end

  class << self
    def send
      payload = Payload.new
      yield payload
      payload.send
    end
  end

Как можноЯ проверяю, получает ли MyModule метод send с блоком, который присваивает "payload text" payload.my_text?

В настоящее время я проверяю только expect(MyModule).to receive(:send).once.Я просмотрел и попробовал Соответствующие Rspec , но не смог добиться цели.(Может быть, я искал неправильные ключевые слова ..)

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я бы посмеялся MyModule, чтобы получить еще одну насмешку, которая позволила бы определить, что my_text= вызывается для данного объекта.

let(:payload) { instance_double('Payload') }

before do
  allow(MyModule).to receive(:send).and_yield(payload)
  allow(payload).to receive(:my_text=).and_return(nil)
end

# expectations 
expect(MyModule).to have_received(:send).once
expect(payload).to have_received(:my_text=).with('payload text').once
0 голосов
/ 12 октября 2018

Самый простой способ - это вставить в качестве аргумента yield двойное число, для которого можно сделать утверждение.

payload = Payload.new
allow(Payload).to receive(:new).and_return(payload)

test_target

expect(payload.my_text).to eq 'payload text'

В качестве альтернативы вы также можете использовать expect_any_instance_of, но я всегда предпочел бывместо этого использовать определенный дубль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...