C# 使用MOQ为复杂操作创建模拟参考和设置方法
我有两种方法,OpenCertificateStore和FindCertificateBySubjectName,并按如下方式实现它们:C# 使用MOQ为复杂操作创建模拟参考和设置方法,c#,.net,unit-testing,mocking,moq,C#,.net,Unit Testing,Mocking,Moq,我有两种方法,OpenCertificateStore和FindCertificateBySubjectName,并按如下方式实现它们: public void OpenCertificateStore() { if (_certificateStore == default(X509Store)) _certificateStore = new X509Store(StoreLocation.CurrentUser);
public void OpenCertificateStore()
{
if (_certificateStore == default(X509Store))
_certificateStore = new X509Store(StoreLocation.CurrentUser);
_certificateStore.Open(OpenFlags.ReadOnly | OpenFlags.IncludeArchived);
}
public X509Certificate2Collection FindCertificateBySubjectName(string certificateSubjectName)
{
X509Certificate2Collection certificates = new X509Certificate2Collection();
if (_certificateStore != default(X509Store))
{
certificates = _certificateStore.Certificates.Find(X509FindType.FindBySubjectName, certificateSubjectName, true);
}
return certificates;
}
我的单元测试如下:
[TestClass]
public class MyHealthTests
{
private Mock<Logger> _logger;
private Mock<MYCertificateManager> _certManager;
[TestInitialize]
public void Initialize()
{
_logger = new Mock<Logger>();
_certManager = new Mock<MYCertificateManager>();
}
[TestMethod]
public void PassName_FindCertiFicatebyName_ShouldReturnValid()
{
MyCertificateHelper myCertHelper = new MyCertificateHelper(_logger.Object,_certManager.Object);
myCertHelper.OpenCertificateStore();
var certNameCollection = myCertHelper.FindCertificateBySubjectName("Valid Cert Name");
Assert.IsNotNull(certNameCollection);
Assert.IsTrue(certNameCollection.Count > 0);
}
}
[TestClass]
公共类健康测试
{
私人模拟记录器;
私人模拟证书管理员;
[测试初始化]
公共无效初始化()
{
_logger=新的Mock();
_certManager=newmock();
}
[测试方法]
公共无效密码\u FindCertiFicatebyName\u ShouldReturnValid()
{
MyCertificateHelper myCertHelper=新的MyCertificateHelper(_logger.Object,_certManager.Object);
myCertHelper.OpenCertificateStore();
var certnamecolection=myCertHelper.FindCertificateBySubjectName(“有效证书名称”);
Assert.IsNotNull(certNameCollection);
Assert.IsTrue(certNameCollection.Count>0);
}
}
这很好,但如果我能找到一种方法来模仿myCertHelper,那就更好了
如果我不使用它们,它将返回null,因为它不查询实际的证书存储。如何模拟
MyCertificateHelper
你没有
这样做没有好处。如果您这样做了,那么测试中的所有类都将被模拟出来,您将不再实际测试任何代码。此时,您最好删除该测试。除了花你的钱来维护它,它什么也做不了
- 在所有内容前面加上
是没有用的。比没用更糟糕的是,它吵闹而且让人分心。放下它李>My
- 我不喜欢你设计中的时间耦合。我不喜欢调用像
或Open
这样的方法。很容易忘记打电话或打了太多次。最好是构造函数将类置于可用状态李>Init
- 很好,你正在注入和踢记录器,但我发现注入记录器是一种代码气味。我发现让我的类引发事件并让记录器监听这些事件要好得多。它消除了一直模拟记录器的需要,并为其他代码提供了很好的挂钩。这种事件驱动的设计最终生成的代码对扩展开放得多,但对修改关闭李>