对私有方法进行单元测试

本文关键字:单元测试 有方法 | 更新日期: 2023-09-27 18:09:15

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

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

私有方法接收对象的一个参数。参数对象较早使用,也用于其他方法中的测试。所以我对此很有信心。私有方法也不使用我传递的空对象。没有依赖关系。想知道是否有另一种方法来单元测试私有方法或我错过了一些东西。

对私有方法进行单元测试

正如其他人所说,您不应该对私有方法进行单元测试。您希望只测试公共方法,因为公共方法表示类的可见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对它们进行常规测试。

你不应该测试非公共方法,无论如何你可以将protected internal作为私有方法,然后将InternalsVisibleToAttribute标记为你的库,这样你就可以通过你的tests

访问protected internal方法