C# X509单元测试证书2

C# X509单元测试证书2,c#,unit-testing,nunit,x509certificate,x509certificate2,C#,Unit Testing,Nunit,X509certificate,X509certificate2,我目前正在使用NUnit框架对.NET应用程序进行单元测试 我们使用的一些方法包括获取X509Certificate2对象作为输入,并检查一个或多个属性是否与某些属性匹配 例如,检查指纹是否存在于非常特定的列表中的方法 因此,我需要一种模拟或伪造X509Certificate2对象的方法,以便控制指纹字段将返回什么或扩展列表将包含什么 一种方法是创建特殊证书,并将其用作测试项目中的资源(硬编码或嵌入式资源) 如果可能的话,我正在寻找一个不同的解决方案 我们将非常感谢您的建议! 提前感谢:)您可以

我目前正在使用NUnit框架对.NET应用程序进行单元测试

我们使用的一些方法包括获取X509Certificate2对象作为输入,并检查一个或多个属性是否与某些属性匹配

例如,检查指纹是否存在于非常特定的列表中的方法

因此,我需要一种模拟或伪造X509Certificate2对象的方法,以便控制指纹字段将返回什么或扩展列表将包含什么

一种方法是创建特殊证书,并将其用作测试项目中的资源(硬编码或嵌入式资源)

如果可能的话,我正在寻找一个不同的解决方案

我们将非常感谢您的建议!
提前感谢:)

您可以围绕一些无法控制的密封实体创建包装器,并重构此实体的用法,因此它不再在您的应用程序中使用(简单地说,确保根本没有对X509的引用):


然后你可以嘲笑它。对于其他情况,例如创建HttpClient,除了“实际”创建一些测试证书之外,没有其他办法了。

要对密封的类或结构进行单元测试,我通常会为此类创建一个包装工厂,并包装密封的结构/类。然后可以模拟包装器和工厂,从而使您能够测试不同的组合。因此,基本上,要么我用新包装器重构整个代码,要么我创建证书并将它们用作资源,对吗?没有其他方法可以实现这一点吗?是的,当您使用密封类时,经常会出现这个问题。如果您想测试不同的DTO组合,那么在设计应用程序时应该考虑到这一点。好的,感谢您的帮助!
public interface ICertificate
{
    //use this only when you pass it back into uncontrolled scope (other libraries, for example OAuth, HttpClient, etc)
    //this also can be hidden by internal interface and extension methods for specifying interaction with uncontrolled scopes. 
    //For example void SetCert(this HttpClient, ICertificate cert);
    X509Certificate Value {get;}
    string Thumbprint {get;}
    string Issuer {get;}
}

public interface ICertificateFactory
{
   ICertificate Create(string path);
   ICertificate Create(X509Certificate value);
   //... and other methods which corresponds to new X509Certificate, from storage or other places.
}