【问题标题】:NUnit: How to test a private method with "ref"parameter in C#NUnit:如何在 C# 中使用“ref”参数测试私有方法
【发布时间】:2010-07-15 06:41:02
【问题描述】:

我有一个私有方法,如下所示:

int void SomeMethod(ref string theStr)
{
   // Some Implementation
}

如何为这个方法编写单元测试用例。

【问题讨论】:

    标签: c# nunit


    【解决方案1】:

    方法无效但采用ref 参数似乎有点毫无意义。让它返回一个字符串可能是有意义的:

    public class FooBar {
     internal string SomeMethod(ref string theStr) { 
        // Some Implementation 
        return theStr;
     }
    }
    

    我们也将其设为 internal 并在 AssemblyInfo.cs 文件中指定 InternalVisibleTo 属性:

     [assembly: InternalsVisibleTo("Test.Assembly")]
    

    这种方式 SomeMethod 将表现得好像它是内部的(即在其程序集之外不可见),但 Test.Assembly 除外,它将其视为 public

    单元测试非常简单(不管它是否采用ref 参数)。

    [Test]
    public void SomeMethodShouldReturnSomething() { 
       Foobar foobar = new Foobar();
       string actual;
       foobar.SomeMethod(ref actual);
       Assert.AreEqual("I'm the test your tests could smell like", actual);
    }
    

    【讨论】:

    • 感谢您的宝贵纠正,但这里我只提供了一个代码片段,这不是实际代码。我的意图是了解使用 ref 关键字测试私有方法的方法。
    • @Nikhil:如果您不提供代表性代码,我们将无法轻易区分哪些差异是相关的,哪些不相关。
    • @Nikhil Verma 该方法是否采用 ref 参数并不重要。查看更新的代码。
    • 我不喜欢这个(尽管我已经做到了)的一点是,通过将“InternalsVisibleTo”放入其中,您正在让您的主程序集知道您的测试程序集。
    • 喜欢旧的香料参考。
    【解决方案2】:

    我通常使方法受保护并提供可继承的可测试类。例如:

    class Foo
    {
      protected void SomeMethod(ref string theStr) { ... }
      ...
    }
    
    class TestableFoo
    {
      public void TestableSomeMethod(ref string theStr)
      {
        base.SomeMethod(...);
      }
      ...
    

    我认为您会找到“您不应该测试私有方法”的答案,但在某些情况下,我发现它对于获得一些棘手的功能很有用。但是,我还发现,在这些情况下,最好将函数提取到它自己的单独的可测试类中。 ymmv。

    【讨论】:

    • 我实际上并不是说你“不需要”测试私有方法,而是你不应该这样做,因为它不是类公共合同的一部分。
    • @kyoryu 确实如此。当没有足够的代码使其成为一个类时,我通常在对内部方法进行单元测试和将功能引入另一个类之间划清界限。对于此类情况,我很乐意稀释测试的纯度。
    • @kyoryu:我经常发现测试类的内部结构比将自己限制在公共 API 上更有效。如果它是一个相对较小的公共 API,但有几个潜在的极端情况,白​​盒测试可以使测试这些极端情况变得更加容易,而无需设置公共 API 所需的其余部分。
    • 我同意你们所有人的看法。但在某些情况下,也有必要测试私有方法。如果有任何机构感兴趣,我也可以举个例子。
    【解决方案3】:

    我的问题是如何为具有 ref 参数的私有方法编写单元测试用例。

    有人说改变实现,是不可能的。可能是我在代码片段中给出了一些错误的实现,但这不是我的意图。

    有人说不需要测试私有方法。但在某些情况下,需要对这些方法进行测试,例如在某些安全代码中。

    答案是:我需要使用反射并从 nunit 设置 setnamedparameterAction。 我需要明确指定特定参数是参考。

    【讨论】:

      【解决方案4】:

      如果测试它很重要,也许您应该将其公开并完成它。 (虽然我意识到这并不能完全回答你的问题)。

      不是每个人都同意为了测试而公开一些东西,但我认为这比一些替代品要好。

      【讨论】:

        猜你喜欢
        • 2010-09-19
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 2013-08-28
        • 1970-01-01
        • 2015-03-13
        相关资源
        最近更新 更多