2017-07-03 70 views
3

我有两种方法,OpenCertificateStore和FindCertificateBySubjectName并实现它们如下复杂的操作模拟参考和设置方法:创建使用起订量

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); 
     } 
    } 

哪些工作正常,但如果我能找到办法模拟myCertHelper会好很多。

如果我确定他们,它会返回null,因为它不查询实际的证书存储。

回答

2

你怎么模拟MyCertificateHelper

你不知道。

这样做没有好处。如果你这样做了,那么你的测试中的所有类都会被嘲笑出来,你将不再测试你的任何代码。那时,你可能会删除测试。它不会做任何事情,但花费你的钱维护它。


  • ,前缀与一切是My没用。比无用的更糟糕,它很嘈杂和分散注意力。算了吧。
  • 我不喜欢你设计中的暂时耦合。我不喜欢需要拨打OpenInit等方法。很容易忘记打电话或多次打电话。如果构造函数将类放入可用状态会更好。
  • 这很好,你注射和踢记录仪,但我发现注射记录仪是一种代码味道。我发现让班级举办活动并让记录员倾听这些活动会更好。它消除了随时模拟记录器的需要,并为其他代码提供了很好的钩子。这种事件驱动的设计最终以更加开放的代码开放,但因修改而关闭。
+0

'我'被替换为实际类名,因为我不想公开类名。它有一个客户名称的前缀:) – Simsons

+1

@Simsons没有太多更好的了。这就是命名空间的用途。 – RubberDuck

+0

我对两三个人持怀疑态度。有一些对象首先配置,然后使用Open或其他方法使其可用(请参见SqlConnection)。这种模式有一个名字,但我忘了它......提高伐木事件限制了使用许多高级场景的可能性。甚至几个服务的注入对于Autofac等帮助者来说也不是问题,并且您不必在每个课程中都实施事件提升。 – t3chb0t