2012-02-24 9 views
13

次のようにMockを設定しています。それはターゲットのコンストラクタに渡されます。ターゲットには、ターゲットの有効期間内に2回呼び出されるDecryptメソッドがあります。 Decryptメソッドが呼び出されるたびに、セットアップで「新規作成」された証明書が破棄されます。しかし、2回目にDecryptオブジェクトを呼び出すとき、私は解読を試みるとObjectDisposedメソッドを取得しています。このモックを、GetCertificate()を呼び出すICertificateHelperAdapterの偽実装に置き換えると、Decryptへの2回目の呼び出しが正しく機能します。同じオブジェクトインスタンスのMock.Setupの後続呼び出し

私は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"); 
    } 

答えて

16

Returns<T>の異なるオーバーロードがdirrently振る舞い:T Returns<T>(T value)

1常に同じインスタンスを返しているものを使用しています。

しかし、Func<T>を使用するレイジーバージョンがあります。彼らはT Returns<T>(Func<T> value)のように見え、セットアップメソッドが呼び出されたときにパラメーターが機能するたびに評価されます。 Moq siteから

サンプル:

// 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()を呼び出します。

+0

プロパティを設定していて、メソッドではない場合、これは機能しません。 – Raj

関連する問題