我试图模拟Expression<Func<>>
在im测试的课堂上应该如何工作。
我对此方法的原始声明如下所示:
var entity = await _repository.GetByIdAsync(input.Id1, x => x.Id2 == "Some String");
现在我想用Moq
来模拟该方法:
// Arrange
entity.Id2 = "Some id";
// Act
_rRepositoryMock.Setup(x =>
x.GetByIdAsync(
It.Is<string>(y => y == input.Id1),
It.Is<Expression<Func<MyEntity, object>>>(z => z.Id2 == "Some id")))
.ReturnsAsync(entity);
从Moq
代码中我得到此错误,Expression<Func<>>
不遵守Id2
的定义。
如何在Moq
Expression<Func<>>
中模拟以在原始实现中按照我想要的方式工作?
编辑
当我输入类似以下内容时:
It.Is<Expression<Func<MyEntity, object>>>(z => z = p => p.Id2 == "Some string")))
我收到此错误:
严重性代码说明项目文件行抑制状态 错误 CS1662 无法将 lambda 表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型
严重性代码说明项目文件行抑制状态 错误 CS0029 无法将类型"System.Linq.Expressions.Expression>"隐式转换为"bool">
编辑2
模拟方法的签名:
Task<MyEntity> GetByIdAsync(string id, params Expression<Func<MyEntity, object>>[] @params);
我找到了解决方案。你不需要嘲笑Expression<Func>>
,你可以简单地将func传递给Moq
,就像这样:
_repositoryMock.Setup(x =>
x.GetByIdAsync(
It.Is<string>(y => y == input.Id1),
z => z.Id2 == "Some id"))
.ReturnsAsync(entity);