2012-02-24 5 views
13

Estoy configurando una simulación como se muestra a continuación. Se pasa al constructor del objetivo. El objetivo tiene un método de descifrado que se llama dos veces durante la vida del objetivo. Cada vez que se llama al método Decrypt, descarta el certificado que se "actualiza" en la configuración. Sin embargo, al llamar al objeto Decrypt la segunda vez, obtengo un método ObjectDisposed al intentar el descifrado. Si reemplazo este simulacro con una implementación falsa de ICertificateHelperAdapter que llama a GetCertificate(), entonces la segunda llamada a Decrypt funciona correctamente.Llamadas posteriores a un resultado de Mock.Setup en la misma instancia de objeto

Deduzco que cuando uso el simulacro, no me devuelve una nueva instancia del objeto en llamadas posteriores a GetCertificate. ¿Esto es por diseño?

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

Respuesta

16

Los diferentes sobrecargas de Returns<T> comporta dirrently:

El uno con T Returns<T>(T value) lo que está utilizando siempre regresa la misma instancia.

Pero hay una versión perezosa que usa Func<T>. Se parecen a T Returns<T>(Func<T> value) y evaluarán cada vez que la función paramter se llame al método de instalación.

muestra del Moq site:

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

Cambiar la configuración de:

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

Y va a llamar a su GetCertificate() dos veces.

+0

Esto no funciona si configuro propiedades y no métodos. – Raj

Cuestiones relacionadas