with unit tests setup mock framework and c# mocking moq

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