2014-12-02 3 views
7

я могу проверить, если аргументы передаются как:испытания, если блок передается с RSpec Mocks

RSpec.describe do 
    it do 
    obj = double 
    expect(obj).to receive(:method).with(1, 2, 3) 
    obj.method(1, 2, 3) 
    end 
end 

Как я должен сделать о параметре блока? Мой идеальный код:

RSpec.describe do 
    it do 
    obj = double 
    proc = Proc.new{} 
    expect(obj).to receive(:method).with(1, 2, 3).with_block(proc) 
    obj.method(1, 2, 3, &proc) 
    end 
end 
+0

Запросили эту функцию по вопросам Rspec https://github.com/rspec/rspec-mocks/issues/1182 – hakunin

ответ

0

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

RSpec.describe do 
    it do 
    obj = double 
    block_is = double('block') 
    block = -> { 
     block_is.run 
    } 

    expect(obj).to receive(:method).with(1, 2, 3).and_yield 
    expect(block_is).to receive(:run) 

    obj.method(1, 2, 3, &block) 
    end 
end 
+0

Спасибо. and_yield немного сложнее, но интересно. – sh01ch1

+0

Хм, мне просто удалось использовать: 'allow (obj) .to получать (: method) .with (1, 2, 3, & a_proc) .and_return (a_value)'. И это сработало, как ожидалось. EDIT: meh, rspec просто проигнорировал блок) – Waterlink

6

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

RSpec.describe do 
    it do 
    obj = double 
    proc = Proc.new{} 
    expect(obj).to receive(:method).with(1, 2, 3) do |*args, &block| 
     expect(proc).to be(block) 
    end 
    obj.method(1, 2, 3, &proc) 
    end 
end 

Однако, мы не можем использовать реализацию блока и другие методы конфигурации ответа в то же время, как receive(:method).with(1, 2, 3){|*| ...}.and_call_original.

+0

Интересно, можете ли вы смоделировать '.and_call_original' с помощью' super (* args, & block) 'в реализации блока .... – Ajedi32

+0

RSpec должен вернуть последнее утверждение в блоке do: –

Смежные вопросы