我在看到另一个解决方案之后使用以下代码来测试私有方法,但这不起作用。编译错误。
FooClass target = new FooClass(DBContext, null, null, null, null)
PrivateObject privObj = new PrivateObject(target);
var actual = privObj.Invoke("privateFoo", fooParam);
私有方法接收一个对象参数。参数对象先前使用,也用于其他方法的测试。所以我对此充满信心。并且私有方法不使用我传递的任何空对象。没有依赖。想知道是否有其他方法对私人方法进行单元测试,或者我错过了什么。
答案 0 :(得分:2)
正如其他人所说,你不应该对私人方法进行单元测试。您只想测试公共方法,因为公共方法代表了您的类的可见API。私有方法是实现细节。
我们假设您有这样的方法:
public IEnumerable<Foo> GetValidCustomers()
{
var customers = _database.GetCustomers();
return this.FilterToValidCustomers(customers);
}
private IEnumerable<Foo> FilterToValidCustomers(IEnumerable<Foo> customers)
{
//crazy complex logic here
}
在此示例中,您要测试是否获得了正确的有效客户集。只要您获得预期的数据,用于过滤客户列表的逻辑就无关紧要了。
如果您的私有方法中的逻辑非常复杂,以至于您无法通过类的公共API进行全面测试,这表明您的课程存在设计问题 - 该课程可能过于复杂。您应该将复杂类解构为多个较小的类,然后通过其公共API正常测试它们。
答案 1 :(得分:0)
您不应该测试非公开方法,无论如何您可以protected internal使用私有方法,然后标记InternalsVisibleToAttribute您的库,以便您可以访问受保护的内部方法你的测试