videos temperamento precio marron irlandés irlandes inglés ingles c# .net mocking tdd moq

c# - temperamento - Moq-Cómo verificar que el valor de una propiedad se establece a través del setter



setter irlandes videos (5)

Considera esta clase:

public class Content { public virtual bool IsCheckedOut {get; private set;} public virtual void CheckOut() { IsCheckedOut = true; } public virtual void CheckIn() { //Do Nothing for now as demonstrating false positive test. } }

El método Checkin está intencionalmente vacío. Ahora tengo algunos métodos de prueba para verificar el estado de llamar a cada método.

[TestMethod] public void CheckOutSetsCheckedOutStatusToTrue() { Content c = new Content(); c.CheckOut(); Assert.AreEqual(true, c.IsCheckedOut); //Test works as expected } [TestMethod] public void CheckInSetsCheckedOutStatusToFalse() { Content c = new Content(); c.CheckIn(); Assert.AreEqual(false, c.IsCheckedOut); //Test does not work as expected }

La 2da prueba pasa por los motivos equivocados. Entonces, ¿cómo puedo usar burla (moq) para verificar que CheckIn establezca la propiedad IsCheckedOut?

Gracias.

EDITAR

Para aclarar: tengo un método llamado CheckIn () cuyo trabajo es establecer el estado IsCheckedOut en falso.

Verá en mi código de prueba anterior que la prueba arrojará falso aunque no establezca el valor de la propiedad en falso; Esto es esperado, nada está mal aquí.

Creo que mi pregunta específicamente es ¿Cómo puedo verificar que el método CheckIn () haya establecido la propiedad IsCheckedOut en falso? Esto es lo que yo llamaría verificación de comportamiento.

Creo que algunos de los comentarios sugirieron hacer algo que equivale a la verificación del estado. Si es así, no creo que haya ningún valor en burlarse de esta parte en absoluto cuando podemos simplemente usar:

Content c = new Content(); c.CheckIn(); Assert.AreEqual(false, c.IsCheckedOut); //State verification

Por supuesto que puedo estar equivocado, así que por favor ayúdame a aclarar estos conceptos :)


¿Puedo sugerir que podría estar pensando en esto de la manera incorrecta? En general, debería establecer algo, realizar una acción y luego verificar el comportamiento (resultado). En este caso, realmente importa que el colocador no lo configure como falso, lo que debería importar es que sea falso después de que se haya ejercido un escenario determinado. Si tomas las pruebas por separado, esto puede parecer un poco extraño, pero para cualquier cosa tus pruebas existirán en conjuntos.

La situación sería diferente si estuviese probando la interacción entre dos clases, entonces estaría bien establecer una expectativa sobre el establecedor de propiedades, ya que la acción de configuración es la interacción que está probando.

No estoy familiarizado con Moq ya que uso Rhino.Mocks, pero supongo que habrá algo parecido a Mock.VerifySet (content => content.IsCheckedOut = It.IsEqual (true));


¿por qué no simplemente configura el contenido que se va a revisar para comenzar? Recuerde, usted solo está probando el comportamiento de la función CheckIn.

[TestMethod] public void CheckInSetsCheckedOutStatusToFalse() { // arrange - create a checked out item Content c = new Content(); c.CheckOut(); // act - check it in c.CheckIn(); // assert - IsCheckedOut should be set back to false Assert.AreEqual(false, c.IsCheckedOut); }


Estoy de acuerdo con usted: burlarse no tiene ningún valor en este escenario, ya que está destinado a probar las interacciones entre su clase (bajo prueba) y el resto del mundo, no para probar el mecanismo interno de su clase.

Creo que esta prueba

Content c = new Content(); c.CheckIn(); Assert.AreEqual(false, c.IsCheckedOut); //State verification

¡que escribes tiene sentido y no es un falso positivo! Debe asegurarse de que el estado sea así después del CheckIn, independientemente de por qué es así; si en el futuro establecerá el estado en el constructor (u otros métodos), esta prueba lo salvará y se verá obligado a implementar el método CheckIn.

En algunos casos similares a su deseo de establecer el estado inicial para asegurarse de que no olvide implementar el método CheckIn; en este caso utilizo 2 métodos (el primero es muy feo):

  1. Llamo a c.CheckOut () antes de c.CheckIn (); esto es muy feo, porque prueba 2 métodos en lugar de uno ... pero admito que escribí algo similar algunas veces :-)
  2. Hago que el setter privado esté protegido, y escribo una clase de prueba que hereda de la clase bajo prueba; de esta manera puedo establecer la propiedad en verdadero antes de llamar a c.CheckIn () para asegurarme de que el método está haciendo su trabajo.

Aquí está el código:

public class Content2 { public virtual bool IsCheckedOut { get; protected set; } public virtual void CheckOut() { IsCheckedOut = true; } public virtual void CheckIn() { //Do Nothing for now as demonstrating false positive test. } } [TestClass] public class Content2Test : Content2 { [TestMethod] public void CheckOutSetsCheckedOutStatusToTrue() { this.CheckOut(); Assert.AreEqual(true, this.IsCheckedOut); //Test works as expected } [TestMethod] public void CheckInSetsCheckedOutStatusToFalse() { this.IsCheckedOut = true; this.CheckIn(); Assert.AreEqual(false, this.IsCheckedOut); //Test does not work as expected } }

Espero ayudar


Lo siguiente debería funcionar Configura tu objeto simulado como:

var mock=new Mock<IContent>(); mock.SetupSet(content => content.IsCheckedOut=It.IsAny<bool>()).Verifiable();

Y después del código de prueba:

mock.VerifySet(content => content.IsCheckedOut=It.IsAny<bool>());

No lo he probado de todos modos, así que por favor dígame si funciona para usted.

EDITAR De hecho, esto no funcionará ya que el organismo que estableció IsCheckedOut es falso.

De todos modos, ahora veo que nunca estableces el valor de IsCheckedOut en el tiempo de construcción de la clase. Sería una buena idea agregar lo siguiente a la clase de Content :

public Content() { IsCheckedOut=false; }