NUnit:如何在C#中使用“ref”参数测试私有方法

时间:2010-07-15 06:41:03

标签: c# nunit

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

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

如何编写此方法的单元测试用例。

4 个答案:

答案 0 :(得分:7)

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

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

我们还在AssemblyInfo.cs文件中创建internal并指定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);
}

答案 1 :(得分:1)

我通常会对方法进行保护并提供一个可继承的可测试类。例如:

class Foo
{
  protected void SomeMethod(ref string theStr) { ... }
  ...
}

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

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

答案 2 :(得分:0)

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

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

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

答案是:我需要使用反射并从nunit设置setnamedparameterAction。 我需要明确指出相关参数是ref。

答案 3 :(得分:0)

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

并非所有人都同意将某些内容公开用于测试,但我认为它比某些替代品更好。