Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MOQ为复杂操作创建模拟参考和设置方法_C#_.net_Unit Testing_Mocking_Moq - Fatal编程技术网

C# 使用MOQ为复杂操作创建模拟参考和设置方法

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

我有两种方法,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);
        }
    }
[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
    这样的方法。很容易忘记打电话或打了太多次。最好是构造函数将类置于可用状态
  • 很好,你正在注入和踢记录器,但我发现注入记录器是一种代码气味。我发现让我的类引发事件并让记录器监听这些事件要好得多。它消除了一直模拟记录器的需要,并为其他代码提供了很好的挂钩。这种事件驱动的设计最终生成的代码对扩展开放得多,但对修改关闭
“My”被替换为实际的类名,因为我不想公开类名。它在客户端名称前加了一个前缀:)这在@Simsons上没有多大用处。这就是名称空间的用途。我对2和3表示怀疑。您首先配置一些对象,然后使用Open或其他方法使它们可用(请参阅SqlConnection)。这个图案有个名字,但我忘了。。。为日志记录引发事件限制了使用许多高级场景的可能性。对于Autofac这样的助手来说,注入甚至几个服务都不是问题,您不必在每个类中都实现引发事件。这取决于usecase@t3chb0t,但我已经处理了足够多的异常嘈杂的日志,我真的更喜欢以尽可能高的级别登录。至于“开放”的东西,Ado教我讨厌这种模式,你会发现McConnel在完整的代码中反对它。