18

我正在设置一个模拟,如下所示。它被传递到目标的构造函数中。目标有一个 Decrypt 方法,该方法在目标的生命周期内被调用两次。每次调用 Decrypt 方法时,它都会处理安装程序中“新”的证书。但是,当第二次调用 Decrypt 对象时,我在尝试解密时得到了一个 ObjectDisposed 方法。如果我用调用 GetCertificate() 的 ICertificateHelperAdapter 的假实现替换此 Mock,则对 Decrypt 的第二次调用将正常工作。

我推断当我使用 Mock 时,它不会在后续调用 GetCertificate 时返回对象的新实例。这是设计使然吗?

    private Mock<ICertificateHelperAdapter> GetCertificateHelperAdapter()
    {
        Mock<ICertificateHelperAdapter> certificateHelper = new Mock<ICertificateHelperAdapter>();

        certificateHelper.Setup(
            ch => ch.GetCertificate(CertStoreName.My, StoreLocation.LocalMachine, It.IsAny<string>())).Returns(this.GetCertificate()).Verifiable();
        return certificateHelper;
    }

    private X509Certificate2 GetCertificate()
    {
        return new X509Certificate2(Environment.CurrentDirectory + "\\" + "azureconfig.pfx", "dingos");
    }
4

1 回答 1

31

的不同重载Returns<T>表现不同:

T Returns<T>(T value)您正在使用的那个总是返回相同的实例。

但是有一个懒惰的版本使用Func<T>. 它们看起来像T Returns<T>(Func<T> value),并且每次调用 setup 方法时都会评估参数函数。

起订量网站的样品:

// lazy evaluating return value
mock.Setup(foo => foo.GetCount()).Returns(() => count);

将您的设置更改为:

certificateHelper.Setup(ch => 
   ch.GetCertificate(CertStoreName.My, StoreLocation.LocalMachine, It.IsAny<string>()))
.Returns(() => this.GetCertificate()).Verifiable(); //note the lambda in Returns

它会打电话给你GetCertificate()两次。

于 2012-02-24T05:18:22.330 回答