C# 如何使用Cucumber或SpecFlow处理来自控制台的交互式输入

C# 如何使用Cucumber或SpecFlow处理来自控制台的交互式输入,c#,ruby,console,cucumber,specflow,C#,Ruby,Console,Cucumber,Specflow,这个问题与RSpec手册中的代码破解示例有关。 请参见此处的代码: 我想知道是否有人已经为破译密码游戏提供了完整的解决方案 我渴望看到如何测试外环,它决定了游戏是否应该继续 功能可能如下所示 你找到密码了 您想再试一次吗?:n 再见 如果用户选择“y”,则游戏再次开始。 我有兴趣了解场景和步骤定义。 会不会是这样的: Scenario: user finds secret code Given the secret code is "1234" When I guess "1234" T

这个问题与RSpec手册中的代码破解示例有关。 请参见此处的代码:

我想知道是否有人已经为破译密码游戏提供了完整的解决方案

我渴望看到如何测试外环,它决定了游戏是否应该继续

功能可能如下所示

  • 你找到密码了
  • 您想再试一次吗?: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?"
另一个等级库文件:

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(mock)输出对象。这个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解决方案也可能有助于


感谢

可以启动控制台应用程序并连接到其标准输入和输出流。请参见的文档中的示例


一种更简洁的方法(这也会使测试更快,但不符合完整的端到端系统测试的条件)是对应用程序进行某种程度的重组,以便它使用常规的
对象,而不是
控制台.In
控制台.Out
main()
方法可以将这些类传递给应用程序的其余部分。然后,您的测试可以直接调用其他方法,并将
MemoryStream
对象作为输入/输出流传递。

谢谢,我还有一些问题。我扩展了我原来的问题,试图提供更多的上下文。你能解释一下我如何使用流对象来测试上面的代码吗?我理解传入mock\stub对象的想法,在这种情况下有点混乱。这是因为此时我已经创建了
game
对象。我不确定我是否正确地解释了这个问题。你明白我的意思吗?我将非常感谢黄瓜步骤的定义。