Moq una función con tipo anónimo

Estoy tratando de burlarme de este método.

Task GetResultAsync(Func transformFunc) 

Me gusta esto

 iMock.Setup(m => m.GetResultAsync(It.IsAny<Func>())).ReturnsAsync(new { isPair = false }); 

El método para probar hacer la llamada pasando un tipo anónimo al parámetro genérico como este

 instance.GetResultAsync(u => new {isPair = u == "something" }) //dont look at the function return because as generic could have diferent implementations in many case 

Moq nunca hace coincidir mi método GetResultAsync con los parámetros enviados.

Estoy usando Moq 4

El tipo anónimo te va a causar problemas. Necesitas un tipo concreto para que esto funcione.

El siguiente ejemplo funcionó cuando cambié

 instance.GetResultAsync(u => new {isPair = u == "something" }) 

a

 instance.GetResultAsync(u => (object) new {isPair = u == "something" }) 

Moq no puede coincidir con el tipo anónimo y es por eso que se null cuando se le llama.

 [TestClass] public class MoqUnitTest { [TestMethod] public async Task Moq_Function_With_Anonymous_Type() { //Arrange var expected = new { isPair = false }; var iMock = new Mock(); iMock.Setup(m => m.GetResultAsync(It.IsAny>())) .ReturnsAsync(expected); var consumer = new Consumer(iMock.Object); //Act var actual = await consumer.Act(); //Assert Assert.AreEqual(expected, actual); } public interface IService { Task GetResultAsync(Func transformFunc); } public class Consumer { private IService instance; public Consumer(IService service) { this.instance = service; } public async Task Act() { var result = await instance.GetResultAsync(u => (object)new { isPair = u == "something" }); return result; } } } 

Si el código que llama a GetResultAsync depende del uso del tipo anónimo, entonces lo que está tratando de hacer con su prueba no funcionará con su configuración actual. Probablemente necesitarías proporcionar un tipo concreto al método.

 [TestClass] public class MoqUnitTest { [TestMethod] public async Task Moq_Function_With_Concrete_Type() { //Arrange var expected = new ConcreteType { isPair = false }; var iMock = new Mock(); iMock.Setup(m => m.GetResultAsync(It.IsAny>())) .ReturnsAsync(expected); var sut = new SystemUnderTest(iMock.Object); //Act var actual = await sut.MethodUnderTest(); //Assert Assert.AreEqual(expected, actual); } class ConcreteType { public bool isPair { get; set; } } public interface IService { Task GetResultAsync(Func transformFunc); } public class SystemUnderTest { private IService instance; public SystemUnderTest(IService service) { this.instance = service; } public async Task MethodUnderTest() { var result = await instance.GetResultAsync(u => new ConcreteType { isPair = u == "something" }); return result; } } }