此问题与RSpec手册中的codebreaker示例有关。 请参阅此处的代码:https://github.com/kristianmandrup/rspec-book-codebreaker/tree/master/features如何使用Cucumber或SpecFlow处理来自控制台的交互式输入
我想知道是否有人为解码器游戏制作了完整的解决方案。
我很想看看如何测试外部循环,它决定游戏是否应该继续。
的功能可能看起来像这样
- 你找到了密码!
- 你想再试一次吗? :N
- 再见
如果用户选择“Y”随后的比赛再次开始。 我有兴趣看到场景和步骤定义。 难道是这样的:
Scenario: user finds secret code
Given the secret code is "1234"
When I guess "1234"
Then I should see "You found the secret code!"
And I should see "Would you like to try again?"
另一个spec文件:
Background: Found secret code
Given the secret code is "1234"
And I guess "1234"
Scenario: user chooses to quit the game
Given I see "Would you like to try again?"
When I enter "n"
Then I should see "Good-bye"
Scenario: user chooses to continue with the game
Given I see "Would you like to try again?"
When I enter "y"
Then I should see "Enter guess:"
如上,目前双(模拟)输出对象传入的链接看到所有输出由该捕获double,然后用于断言。输入有点不同。当应用程序显示“您想再试一次吗?”时,输入模拟需要回复“y”或“n”,具体取决于测试。也许这不是要走的路吗?
有类似于模仿用户猜测的东西,即步骤定义如下所示:
When /^I guess "([^\"]*)"$/ do |guess|
@game.guess(guess)
end
这是当前的主要方法:
def generate_secret_code
options = %w[1 2 3 4 5 6]
(1..4).map { options.delete_at(rand(options.length))}.join
end
game = Codebreaker::Game.new(STDOUT)
secret_code = generate_secret_code
at_exit { puts "\n***\nThe secret code was: #{secret_code}\n***" }
game.start(secret_code)
while guess = gets.chomp
game.guess(guess)
end
没有任何试验中加入外环。我想知道如何处理gets.chomp - 我该如何“嘲笑”那种行为?这是如何处理控制台的交互输入?
我实际上使用SpecFlow和C#,如果可能的话,为C#提供一个解决方案。 Ruby的解决方案还可以帮助...
感谢
谢谢,我还有一些问题。我已经提出了我的原始问题,试图给出更多的上下文。你能解释一下如何使用流对象来测试上面的“while guess = gets.chomp”代码吗?我理解传递模拟\存根对象的想法,在这种情况下,它有点令人困惑。这是因为通过这一点,我已经创建了“游戏”对象。我不确定我是否正确解释问题。你看到我在驾驶什么吗?我真的很感谢黄瓜步骤的定义。 – Daryn 2012-01-03 22:07:38