如何使用moq框架在c#中编写私有方法的单元测试?

时间:2014-08-11 07:33:17

标签: c# unit-testing moq

我想使用moq框架在C#中编写私有方法的单元测试,我在StackOverFlow和Google中搜索,但我找不到预期的结果。如果可以,请帮助我。

4 个答案:

答案 0 :(得分:35)

你不能,至少不能和Moq一起使用。

但更重要的是,你不应该。 首先,您不测试方法,您测试行为。其次,为了测试行为,您可以使用类型的 public API并验证该练习的结果。

私有方法是实现细节。您不想验证如何完成任务,您想验证的事情是否已完成。

答案 1 :(得分:8)

也许你不应该(看其他答案为什么),但你可以使用Microsoft's Visual Studio Test Tools来做到这一点。下面给出一个简化的例子。

鉴于您要测试的以下课程:

public class ClassToTest
{
    private int Duplicate(int n)
    {
        return n*2;
    }
}

您可以使用以下代码测试私有Duplicate方法:

using Microsoft.VisualStudio.TestTools.UnitTesting;

// ...

[TestMethod]
public void MyTestMethod()
{
    // Arrange
    var testClass = new ClassToTest();
    var privateObject = new PrivateObject(testClass);

    // Act
    var output = (int) privateObject.Invoke("Duplicate", 21);

    // Assert
    Assert.AreEqual(42, output);
}

答案 2 :(得分:6)

简单地说,你不是。私有方法对其他类不可见。

有很多方法可以解决这个问题:

  • 将私有视为您正在测试的方法的一部分,将其覆盖在单元测试中。将公共方法视为黑盒并测试其操作。
  • 使其受到保护,并从您正在测试的课程中继承您的考试课程(或使用部分相同的想法)
  • 公开(如果您对界面进行编码并未将其公开给您的消费者),

对于公共方法(选项三),可以部分模拟可以替换方法的类。在Moq你可以这样做:

var moq = new Mock<MyClass>();
moq.CallBase = true;
moq.Setup(x => x.MyPublicMethodToOverride()).Returns(true);

还有更多详情here

答案 3 :(得分:6)

在项目的AssemblyInfo.cs中添加

[assembly: InternalsVisibleTo("Namespace.OfYourUnitTest.Project")]

然后你将方法设为内部而非私有。

它有利于避免公开。

然而正如dcastro所指出的,有些人强烈不同意这种测试方式。

相关问题