单元测试私有方法

时间:2014-06-19 14:28:04

标签: c# unit-testing private

我在看到另一个解决方案之后使用以下代码来测试私有方法,但这不起作用。编译错误。

FooClass target = new FooClass(DBContext, null, null, null, null) 
PrivateObject privObj = new PrivateObject(target);
var actual = privObj.Invoke("privateFoo", fooParam); 

私有方法接收一个对象参数。参数对象先前使用,也用于其他方法的测试。所以我对此充满信心。并且私有方法不使用我传递的任何空对象。没有依赖。想知道是否有其他方法对私人方法进行单元测试,或者我错过了什么。

2 个答案:

答案 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您的库,以便您可以访问受保护的内部方法你的测试