Rspec Mocks:从方法调用中模拟/生成块

Der*_*ley 8 lambda rspec mocking

我有这个代码:

Net::SSH.start(@server, @username, :password => @password) do |ssh|
            output = ssh.exec!(@command)
            @logger.info 'SSH output: '
            @logger.info output
        end
Run Code Online (Sandbox Code Playgroud)

我可以使用像这样的RSpec模拟框架来模拟SSH.Start,告诉我我已经启动了SSH会话:

Net::SSH.should_receive(:start).with("server", "user", :password => "secret") do
            @started = true
        end

这告诉我是否@started ssh会话.现在我需要模拟ssh.exec!方法,这很容易:

Net::SSH.should_receive(:exec!).with("command")...
Run Code Online (Sandbox Code Playgroud)

但是如何产生/调用包含ssh.exec的块呢!方法调用,因为我已经模拟了SSH.start方法?我可以调用一些简单的方法来执行这个块,但是我不知道它是什么,也找不到任何关于rspec模拟框架的真正好的解释/文档.

Avd*_*vdi 19

Net::SSH.should_receive(:start).with(
  "server", "user", :password => "secret").and_yield(
  "whatever value the block should yield")
Run Code Online (Sandbox Code Playgroud)

不确定为什么需要设置@started,因为should_receive验证方法已被调用.