代码之家  ›  专栏  ›  技术社区  ›  pavanred

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

  •  7
  • pavanred  · 技术社区  · 14 年前

    public void Test(out int a)
    {
         a = Convert.ToInt16(Console.ReadLine());  
    }
    

    我试着在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");    
    }
    

    2 回复  |  直到 14 年前
        1
  •  3
  •   Lee    14 年前

    你可以用 SetIn 方法 System.Console 要设置输入源:

    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'
    
        2
  •  2
  •   Disillusioned    14 年前

    这里有两个稍微不同的问题。

    1. 您想测试一个在out参数中返回值的方法。这实际上非常简单,与作为普通函数返回其值的方法几乎没有区别。
    2. 您想要测试从控制台读取输入的方法。这是一个相当棘手的,并进入了一个小的设计对象,你试图测试。问题是“Console”是一个全局对象,这会立即增加测试的难度。

    作为对#2的回答,我建议您看看Misko Hevery关于编写可测试代码的一些文章和视频。

    http://misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/

    针对您的问题的简要总结:

    • MethodToTest 当前需要来自控制台的输入。
    • 持有 方法测试
    • ,您的类将以普通的“Console”作为其输入流创建。
    • 测试代码 嘲弄 将提供由测试控制的值的输入流。
    • 通过这种方式,你的测试可以自动化,并在输入方面得到很好的控制;以及预期产出。

    基本示例代码

    [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");
    }