nunit - Uso de Verificar para confirmar los valores de parámetros esperados en la clase simulada Moq
autofixture (2)
En Verify
Moq, por defecto, verifica la igualdad de referencia para los argumentos, de modo que solo pasa cuando proporciona las mismas instancias (excepto si ha reemplazado Equals
) en sus pruebas y en su implementación.
En su caso, expectedA.Value
simplemente devuelve el new A { P1 = 1 }
creado en la prueba que, por supuesto, no es la misma instancia creada en DoSomethingWith
.
It.Is
usar el constructo It.Is
de Moq para It.Is
correctamente sin anular Equals
(de hecho, para esto no necesita Autofixture):
barMock.Verify(m => m.Something(It.Is<A>(arg => arg.P1 == a.P1)));
Pero si tiene varias propiedades como P1, P2, P3 ... AutoFixture puede ser útil:
barMock.Verify(m => m.Something(It.Is<A>(arg => expectedA.Equals(a))));
Porque no necesita escribir las comprobaciones de equidad manualmente para todas las propiedades.
Estoy intentando verificar que se llame a un método dentro de un simulacro con un parámetro de objeto esperado. Estoy usando Moq, nUnit y pensando que la semejanza de AutoFixture debería hacer el trabajo. A continuación hay una versión simplificada de lo que intento hacer.
¿Hay alguna manera de hacer esto con AutoFixture? ¿Hay una forma mejor de verificar que se llama Something
con el parámetro apropiado?
Anulación Iguala en la clase A
para comparar los valores de las propiedades y cambiar la línea de Verify
por:
barMock.Verify(m => m.Something(a));
pasa, sin embargo prefiero no anular Equals en todas las clases como A en mi proyecto.
namespace Test
{
using Moq;
using NUnit.Framework;
using Ploeh.SemanticComparison.Fluent;
public class A
{
public int P1 { get; set; }
}
public interface IBar
{
void Something(A a);
}
public class Foo
{
public A Data { get; private set; }
public void DoSomethingWith(IBar bar)
{
Data = new A { P1 = 1 };
bar.Something(Data);
}
}
[TestFixture]
public class AutoFixtureTest
{
[Test]
public void TestSample()
{
var foo = new Foo();
var barMock = new Mock<IBar>();
var a = new A { P1 = 1 };
var expectedA = a.AsSource().OfLikeness<A>();
foo.DoSomethingWith(barMock.Object);
expectedA.ShouldEqual(foo.Data); // passes
barMock.Verify(m => m.Something(expectedA.Value)); // fails
}
}
}
Si actualiza a AutoFixture 2.9.1 (o posterior), puede llamar al método CreateProxy en la instancia de Semejanza que emitirá un proxy dinámico para el tipo de destino.
El proxy dinámico generado anula el uso de Likeness que simplifica la sintaxis (bastante).
Aquí está el método de prueba original, modificado para usar el proxy de semejanza:
[Test]
public void TestSample()
{
var foo = new Foo();
var barMock = new Mock<IBar>();
var expected = new A().AsSource().OfLikeness<A>().CreateProxy();
expected.P1 = 1;
foo.DoSomethingWith(barMock.Object);
Assert.True(expected.Equals(foo.Data)); // passes
barMock.Verify(m => m.Something(expected)); // passes
}
Tenga en cuenta que también hace que la afirmación de la prueba sea mucho más específica que aceptar Cualquier instancia.
Puede encontrar más detalles sobre esta nueva función here .