gpt4 book ai didi

ruby - 理解 RSpec 中对 as_null_object 的需求

转载 作者:数据小太阳 更新时间:2023-10-29 08:51:08 25 4
gpt4 key购买 nike

在阅读 RSpec Book 时,我遇到了 as_null_object方法。我不明白这本书提供的关于为什么需要它的解释:

... the simplest way is to tell the double output to only listen for the messages we tell it to expect and ignore any other messages.

但是为什么示例代码会失败?当我们在每个示例中调用 double('output') 时,我们不是为每个示例创建了一个新的 double 对象并向它发送一条消息吗?

我想要的是对示例代码失败的原因以及 as_null_object 如何解决该问题的更深入的解释(比本书更深入)。

  it "sends a welcome message" do
output = double('output')
game = Game.new(output)
output.should_receive(:puts).with('Welcome to Codebreaker!')
game.start
end

it "prompts for the first guess" do
output = double('output')
game = Game.new(output)
output.should_receive(:puts).with('Enter guess:')
game.start
end

这本书试图解释前面部分错误的原因,但我还是不明白解释。

We've told the double in the first example to expect puts "Welcome to Codebreaker!" and we've satisfied that requirement, but we've only told it to expect "Welcome to Codebreaker!" It doesn't know anything about "Enter guess:"

Similarly, the double in the second example expects "Enter guess:" but the first message it gets is "Welcome to Codebreaker".

最佳答案

当您使用 output = double('output') 创建 double 时然后将其传递给Game.new(output)中的新游戏,那个替身将收到它在密码破解游戏代码中传递的每条消息。你没有包括它,但是 start方法有以下代码:

module Codebreaker
class Game
...
def start
@output.puts 'Welcome to Codebreaker!'
@output.puts 'Enter guess:'
end
end
end

在这里,记住双 output已分配给实例变量 @outputgameinitialize方法,因此在每个规范中调用它时都带有两条消息,首先是“欢迎使用 Codebreaker!”,然后是“输入猜测:”。

没有as_null_object , output当 double 收到它期望的以外的任何东西时,它会失败,即在第一个规范中除了“欢迎使用 Codebreaker!”之外的任何东西。在第二个规范中,除了“输入猜测:”之外的任何内容。通过使用 as_null_object在双重情况下,您告诉它坐下来等待并忽略它期望之外的任何事情。这样就避免了上面的问题。

希望对您有所帮助。

关于ruby - 理解 RSpec 中对 as_null_object 的需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12717494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com