2011-10-03 8 views
7

Con NSubstitute, ¿hay alguna forma de capturar el valor que pasa a un setter de la propiedad?NSubstituir la invocación de la propiedad "setter" interceptor solo

E.g. si tengo la siguiente interfaz:

public interface IStudent { 
    int Id { set; } 
    string Name { set; } 
} 

El decir que tengo un sustituto por ejemplo creado:

var _studentSub = Substitute.For<IStudent>(); 

¿Hay alguna manera de que pueda interceptar y capturar el valor si cualquiera de los "set" métodos de el sustituto se invoca?

Respuesta

13

El enfoque estándar para NSubstitute es tener propiedades con getters y setters, ya que las propiedades en los sustitutos funcionarán como se espera (es decir, obtendrás lo que está configurado).

Si la interfaz tiene que tener propiedades setter sólo puede capturar el valor de una propiedad individual utilizando Arg.Do:

[Test] 
public void Setter() { 
    var sub = Substitute.For<IStudent>(); 
    var name = ""; 
    sub.Name = Arg.Do<string>(x => name = x); 

    sub.Name = "Jane"; 

    Assert.AreEqual("Jane", name); 
} 
+0

Para una propiedad con get/set, ¿Se puede utilizar sub.Name = Arg.Do (x => nombre = x); para capturar un valor y aún usar sub.Name.Returns ("MySampleName"); para devolver los valores? ¡La 'devolución' no parece funcionar para nosotros! – bstack

+1

Acabo de marcar, parece ser un error que mezcla Arg.Do y Returns para la misma propiedad get/set. Funciona si cambias Arg.Do por When..Do. p.ej. "sub.When (x => x.Name = Arg.Any ()). Do (x => name = x.Arg ());" –

+1

Ver [informe de errores] (https://github.com/nsubstitute/NSubstitute/issues/59) para trabajar When..Do example. –

Cuestiones relacionadas