如何使用NUnit测试带有out或ref参数的方法?

7
如果我有一个函数,它接受一个输出参数,并从控制台接受输入 -
public void Test(out int a)
{
     a = Convert.ToInt16(Console.ReadLine());  
}

如何在NUnit测试期间使用Console.Readline()接受输入? 我如何使用NUnit测试此方法?

我尝试在我的NUnit测试用例中使用以下代码 -

[TestCase]
public void test()
{
     int a = 0;   
     ClassAdd ad = new ClassAdd();
     ad.addition(out a);

     //a should be equal to the value I input through console.Readline()
     Assert.AreEqual(<some value I input>, a, "test");    
}

如何测试一个接受来自控制台用户输入和out参数的方法?

2个回答

3
您可以使用System.ConsoleSetIn方法来设置输入源:
StringReader reader = new StringReader("some value I input" + Enivronment.NewLine);
Console.SetIn(reader);

int a = 0;   
ClassAdd ad = new ClassAdd();
ad.addition(out a);

Assert.AreEqual(<some value I input>, a, "test");

编辑:要测试多个值,只需用新行分隔每个输入:

string[] lines = new[] { "line1", "line2" };
StringReader input = new StringReader(String.Join(Environment.NewLine, lines));
Console.SetIn(input);

string input1 = Console.ReadLine();    //will return 'line1'
string input2 = Console.ReadLine();    //will return 'line2'

哦,谢谢。如果我有多个输入值,即我需要从控制台接受多个值。我该怎么做? - pavanred
+1 很好知道。你可以模拟其读取器而不是嘲笑 Console。这对于一个类依赖于 Console,但没有为可测试性而设计的情况肯定会有所帮助。 - Disillusioned

2
这里涉及到两个稍有不同的问题:
  1. 你想要测试一个返回值在out参数中的方法,这其实很简单,与一个将其值作为普通函数返回的方法几乎没有区别。
  2. 你想要测试一个从控制台读取输入的方法。这个问题比较棘手,并且需要考虑你试图测试的对象的设计。问题在于“控制台”是一个全局对象,这使得测试变得更加困难。
最疯狂的事情是你想要测试一个从控制台获取输入的方法。也就是说,这意味着用户交互。这不是“自动化测试”的正确方式,你不认为吗?
对于第二个问题,我建议你查看一些Misko Hevery关于编写可测试代码的文章和视频。 http://misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/ 针对你的问题,以下是一个简要概述:
  • MethodToTest目前需要从控制台获取输入。
  • 包含MethodToTest的类应在其构造函数中接受一个“输入流”。(这是一种称为依赖注入的技术。)
  • 生产代码中,你的类将使用正常的“控制台”作为其输入流。
  • 测试代码中,该类将使用一个Mock输入流进行构造,该输入流将提供由测试控制的值。
  • 通过这种方式,你的测试可以自动化,并且在输入方面得到很好的控制;因此可以预期输出。
以下是基本示例代码。
[TestCase] 
public void test() 
{ 
  <use appropriate type here> MockInputStream = new ...;
  ClassToTest testClass = new ClassToTest(MockInputStream);

  int Actual = 0;
  MockInputStream.PutNextInput("4");
  ClassToTest.MethodToTest(out Actual);

  Assert.AreEqual(4, Actual, "MockInputStream placed 4 as the next value to read");
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接