.net-单元测试C#受保护的方法

我来自Java EE世界,但是现在我正在研究.Net项目。 在Java中,当我想测试一个受保护的方法时,这非常容易,只需具有相同包名的测试类就足够了。

C#有类似的东西吗? 对受保护的方法进行单元测试是否有任何好的做法? 我只发现框架,有人说我应该只测试公共方法。

无需任何框架就可以做到这一点……

fiso asked 2019-11-07T08:40:37Z
6个解决方案
66 votes

您可以在测试类上继承要测试的类。

public class Test1 : SomeClass
{
    Asert.AreEqual(1, SomeClass.ProtectedMethod());
}
unarity answered 2019-11-07T08:40:55Z
25 votes

另一个选择是对这些方法使用AssemblyInfo.cs,然后使用AssemblyInfo.cs使您的测试程序集可以访问这些方法。 这不会阻止该方法被同一程序集中的其他类占用,但是会阻止这些方法被不是您的测试程序集的其他程序集访问。

这并没有为您提供太多的封装和保护,但是非常简单明了并且非常有用。

在包含内部方法的程序集中添加到AssemblyInfo.cs

[assembly: InternalsVisibleTo("TestsAssembly")]
Richard Garside answered 2019-11-07T08:41:33Z
13 votes

您可以在继承您要测试的类的新类中公开受保护的方法。

public class ExposedClassToTest : ClassToTest
{
    public bool ExposedProtectedMethod(int parameter)
    {
        return base.ProtectedMethod(parameter);
    }
}
typhon04 answered 2019-11-07T08:41:58Z
5 votes

您可以使用PrivateObject类访问所有私有/受保护的方法/字段。

PrivateObject是Microsoft单元测试框架中的一个类,该类是一个包装器,可以调用通常无法访问的成员进行单元测试。

Usama Aslam answered 2019-11-07T08:42:30Z
3 votes

您可以使用反射来调用私有和受保护的方法。

看到这里更多:

[http://msdn.microsoft.com/en-us/library/66btctbe.aspx]

Justin Harvey answered 2019-11-07T08:43:09Z
2 votes

尽管公认的答案是最好的答案,但这并不能解决我的问题。 从受保护的类派生而来的是,我的测试类还污染了许多其他内容。 最后,我选择将要测试的逻辑提取到公共类中并进行测试。 当然,这对每个人都行不通,可能需要进行一些重构,但是如果您一直滚动到此答案,可能会对您有所帮助。 :)这是一个例子

旧情况:

protected class ProtectedClass{
   protected void ProtectedMethod(){
      //logic you wanted to test but can't :(
   }
}

新情况:

protected class ProtectedClass{
   private INewPublicClass _newPublicClass;

   public ProtectedClass(INewPublicClass newPublicClass) {
      _newPublicClass = newPublicClass;
   }

   protected void ProtectedMethod(){
      //the logic you wanted to test has been moved to another class
      _newPublicClass.DoStuff();
   }
}

public class NewPublicClass : INewPublicClass
{
   public void DoStuff() {
      //this logic can be tested!
   }
}

public class NewPublicClassTest
{
    NewPublicClass _target;
    public void DoStuff_WithoutInput_ShouldSucceed() {
        //Arrange test and call the method with the logic you want to test
        _target.DoStuff();
    }
}
nozem answered 2019-11-07T08:43:47Z
translate from https://stackoverflow.com:/questions/13416223/unit-testing-c-sharp-protected-methods