C# 私有方法的单元测试

C# 私有方法的单元测试,c#,unit-testing,private,C#,Unit Testing,Private,在看到另一个解决方案后,我使用以下代码来测试私有方法,但这不起作用。编译错误 FooClass target = new FooClass(DBContext, null, null, null, null) PrivateObject privObj = new PrivateObject(target); var actual = privObj.Invoke("privateFoo", fooParam); 私有方法接收对象的一个参数。Parameter对象在前面使用过,在其他方法中

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

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

私有方法接收对象的一个参数。Parameter对象在前面使用过,在其他方法中也用于测试。所以我有信心。私有方法也不使用我传递的任何空对象。没有依赖关系。想知道是否有其他方法可以对私有方法进行单元测试,或者我遗漏了什么。

您不应该测试非公共方法,无论如何,您可以创建您的私有方法,然后标记您的库,这样您就可以通过测试访问受保护的内部方法。

正如其他人所说,您不应该对私有方法进行单元测试。您希望只测试公共方法,因为公共方法表示类的可见API。私有方法是实现细节

假设您有这样一种方法:

public IEnumerable<Foo> GetValidCustomers() 
{
    var customers = _database.GetCustomers();
    return this.FilterToValidCustomers(customers);
}
private IEnumerable<Foo> FilterToValidCustomers(IEnumerable<Foo> customers) 
{
    //crazy complex logic here 
}
public IEnumerable GetValidCustomers()
{
var customers=_database.GetCustomers();
返回此.FilterToValidCustomers(客户);
}
私有IEnumerable筛选器虚拟客户(IEnumerable客户)
{
//这里有疯狂复杂的逻辑
}
在本例中,您希望测试您是否获得了正确的有效客户集。它用来过滤客户列表的逻辑是不相关的,只要你得到了你想要的数据


如果您的私有方法中有非常复杂的逻辑,而您在通过类的公共API进行完全测试时遇到了困难,这表明您的类存在设计问题——该类可能太复杂了。您应该将复杂类解构为多个较小的类,然后通过它们的公共API正常测试它们。

能否详细说明代码“不工作”的原因。你在期待什么,到底发生了什么?如果您遇到异常,请发布发生异常的行和异常详细信息。您是否使用某种单元测试框架?一般来说,有比在私有方法上使用反射更好的方法来测试代码。为什么不测试使用私有方法的公共方法呢?可能的重复可能的重复