最小起订量表达式<func<>>



我试图模拟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的定义。

如何在MoqExpression<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);

最新更新