2012-02-24 13 views
13

Sto configurando un Mock come mostrato di seguito. È passato nel costruttore del bersaglio. L'obiettivo ha un metodo Decrypt che viene chiamato due volte nel corso della vita del target. Ogni volta che viene chiamato il metodo Decrypt, viene disattivato il certificato "newed" nel Setup. Tuttavia, quando si richiama l'oggetto Decrypt la seconda volta, ottengo un metodo ObjectDisposed al tentativo di decrittografia. Se sostituisco questo Mock con un'implementazione Fake di ICertificateHelperAdapter che chiama GetCertificate(), quindi la seconda chiamata a Decrypt funziona correttamente.Chiamate successive a un risultato Mock.Setup nella stessa istanza dell'oggetto

Sto deducendo che quando uso il Mock, non mi sta restituendo una nuova istanza dell'oggetto nelle chiamate successive a GetCertificate. È questo in base alla progettazione?

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

risposta

16

I diversi overload di Returns<T> si comporta dirrently:

Quello con T Returns<T>(T value) ciò che si sta utilizzando sempre di tornare la stessa istanza.

Ma esiste una versione lenta che utilizza Func<T>. Sono come T Returns<T>(Func<T> value) e valuteranno ogni volta che la funzione del parametro viene chiamata quando viene chiamato il metodo di configurazione.

campione dal Moq site:

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

modificare la configurazione per:

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

E sarà chiamare il GetCertificate() due volte.

+0

Questo non funziona se imposto le proprietà e non i metodi. – Raj

Problemi correlati