接收块作为参数的模拟方法

发布于 2024-09-10 03:10:46 字数 206 浏览 11 评论 0原文

我有一个或多或少像这样的场景,

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

我正在对 A 类进行单元测试,我想知道 B#new 是否正在接收传递给 A#new 的块。我使用 Mocha 作为模拟框架。

是否可以?

I have a scenario more or less like this

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

I am unit testing class A and I want to know if B#new is receiving the block passed to A#new. I am using Mocha as mock framework.

Is it possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鹿港巷口少年归 2024-09-17 03:10:46

我用 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

I tried this with both Mocha and RSpec and although I could get a passing test, the behavior was incorrect. From my experiments, I conclude that verifying that a block is passed is not possible.

Question: Why do you want to pass a block as a parameter? What purpose will the block serve? When should it be called?

Maybe this is really the behavior you should be testing with something like:

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
晨与橙与城 2024-09-17 03:10:46

我想你想要:

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

我知道这适用于 RSpec,如果 Mocha 不能处理我会感到惊讶

I think you want:

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

I know this works with RSpec, I'd be surprised if Mocha doesn't handle

微凉徒眸意 2024-09-17 03:10:46

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

Is B::new yielding to the block and does the block modify a param that yield provides? If yes, then you can test it this way:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文