我想使用moq框架在C#中编写私有方法的单元测试,我在StackOverFlow和Google中搜索,但我找不到预期的结果。如果可以,请帮助我。
答案 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所指出的,有些人强烈不同意这种测试方式。