2012-01-03 73 views
1

此问题与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的解决方案还可以帮助...

感谢

回答

0

有可能推出一个控制台应用程序,连接到它的标准输入和输出流。请参阅ProcessStartInfo.RedirectStandardInput文档中的示例。一个更简洁的方法(这也会使测试更快,但不能作为完整的端到端系统测试)将有点重构应用程序,以便它使用常规的Stream对象而不是Console.In,而使用常规的Stream对象而不是Console.InConsole.Out; main()方法可以将这些类传递给应用程序的其余部分。然后,您的测试可以直接调用其他方法,并将对象作为输入/输出流传递。

+0

谢谢,我还有一些问题。我已经提出了我的原始问题,试图给出更多的上下文。你能解释一下如何使用流对象来测试上面的“while guess = gets.chomp”代码吗?我理解传递模拟\存根对象的想法,在这种情况下,它有点令人困惑。这是因为通过这一点,我已经创建了“游戏”对象。我不确定我是否正确解释问题。你看到我在驾驶什么吗?我真的很感谢黄瓜步骤的定义。 – Daryn 2012-01-03 22:07:38

相关问题