Ложные методы, которые получают блок в качестве параметра - PullRequest
6 голосов
/ 15 июля 2010

У меня есть сценарий, более или менее похожий на этот

class A
  def initialize(&block)
    b = B.new(&block)
  end
end

Я являюсь модульным тестером класса A, и я хочу знать, получает ли B # new блок, переданный A # new. Я использую Mocha в качестве фиктивного фреймворка.

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

Я пробовал это как с Mocha, так и с RSpec, и хотя я мог пройти прохождение теста, поведение было неправильным. Из моих экспериментов я пришел к выводу, что проверить, что блок пройден, невозможно.

Вопрос: Почему вы хотите передать блок в качестве параметра? Какой цели будет служить блок? Когда это должно быть названо?

Может быть, это действительно поведение, которое вы должны тестировать с чем-то вроде:

class BlockParamTest < Test::Unit::TestCase

  def test_block_passed_during_initialization_works_like_a_champ
    l = lambda {|name| puts "Hello #{name}"}
    l.expects(:call).with("Bryan")
    A.new(&l) 
  end

end
0 голосов
/ 02 декабря 2014

Поддается ли B::new блоку и изменяет ли блок параметр, предоставленный yield? Если да, то вы можете проверить это следующим образом:

require 'minitest/autorun'
require 'mocha/setup'

describe 'A' do

  describe '::new' do

    it 'passes the block to B' do
      params = {}
      block = lambda {|p| p[:key] = :value }
      B.expects(:new).yields(params)

      A.new(&block)

      params[:key].must_equal :value
    end

  end

end
0 голосов
/ 15 июля 2010

Я думаю, что вы хотите:

l = lambda {}
B.expects(:new).with(l)
A.new(&l)

Я знаю, что это работает с RSpec, я был бы удивлен, если бы Mocha не справился

...