c# - unit - MOQ Mock método vacío que cambia el valor de un campo
verify moq (2)
Soy nuevo en MOQ y Mocking.
Supongamos que tengo una clase como esta, con un método nulo que cambia un valor:
public class Sample
{
public virtual int Number { get; set; }
public virtual void Check(int a)
{
this.Number = a > 10 ? this.Number = 100 : this.Number = 200;
}
}
Quiero probar el método nulo para asegurarme de que está cambiando el Number
campo local.
[Fact]
public void TestSampleClass()
{
var sut = new Mock<Sample>();
sut.Setup(s => s.Number).Returns(50);
sut.Setup(s => s.Check(It.IsAny<int>())).Callback(
(int testNumber) =>
{
if (testNumber > 10)
{
sut.Setup(s => s.Number).Returns(100);
}
else
{
sut.Setup(s => s.Number).Returns(200);
}
});
}
Parece que el método no cambia el valor a 100 o 200 ... Si sut.Object.Number
, da el valor inicial, no el actualizado después de la llamada vacía.
Callback
método de Callback
simplemente establece el comportamiento del método, para realizar algunos cambios que realmente necesita llamar al método sut.Object.Check(11);
es decir, sut.Object.Check(11);
, entonces puedes afirmar tus resultados.
A menos que su ejemplo sea una representación simplificada de un problema mucho más complicado, no es necesario burlarse de la clase Sample
.
[Fact]
public void TestSampleClass()
{
//Arrange
var testNumber = 5; //Could be what ever number you want to test
var expected = 200
var sut = new Sample();
//Act
sut.Check(testNumber);
var actual = sut.Number;
//Assert
Assert.AreEqual(expected, actual);
}
Si la intención era aprender cómo realizar dicha prueba en esta situación particular, entonces puedes hacer algo como esto ...
Suponiendo que quisiera probar que el método Check
en la siguiente interfaz ...
public interface ISample {
int Number { get; set; }
void Check(int a);
}
donde el comportamiento esperado es hacer que el método cambie el valor de una propiedad usando Moq
entonces así es como puedes configurarlo.
[Fact]
public void TestISampleCheck() {
//Arrange
var testNumber = 5; //Could be what ever number you want to test
var expected = 200;
var mock = new Mock<ISample>();
//Specifies that the all properties on the mock should have "property behavior",
//meaning that setting its value will cause it to be saved and later returned
//when the property is requested. (this is also known as "stubbing"). The default
//value for each property will be the one generated as specified by the Moq.Mock.DefaultValue
//property for the mock.
mock.SetupAllProperties();
var sut = mock.Object;
mock.Setup(s => s.Check(It.IsAny<int>()))
.Callback((int a) => {
if (a > 10) {
sut.Number = 100;
} else {
sut.Number = 200;
}
});
//Act
sut.Check(testNumber);
var actual = sut.Number;
//Assert
Assert.AreEqual(expected, actual);
}