【发布时间】:2010-07-15 02:17:05
【问题描述】:
我有一个或多或少这样的场景
class A
def initialize(&block)
b = B.new(&block)
end
end
我正在对 A 类进行单元测试,我想知道 B#new 是否正在接收传递给 A#new 的块。我正在使用 Mocha 作为模拟框架。
有可能吗?
【问题讨论】:
标签: ruby testing mocking ruby-mocha
我有一个或多或少这样的场景
class A
def initialize(&block)
b = B.new(&block)
end
end
我正在对 A 类进行单元测试,我想知道 B#new 是否正在接收传递给 A#new 的块。我正在使用 Mocha 作为模拟框架。
有可能吗?
【问题讨论】:
标签: ruby testing mocking ruby-mocha
我用 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
【讨论】:
我想你想要:
l = lambda {}
B.expects(:new).with(l)
A.new(&l)
我知道这适用于 RSpec,如果 Mocha 不能处理,我会感到惊讶
【讨论】:
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
【讨论】: