验证moq设置中参数类的参数

  • 本文关键字:参数 moq 设置 验证 c# moq
  • 更新时间 :
  • 英文 :

context.Setup(x => x.ExecuteQuery(It.IsAny<GetBrowserByNameQuery>())).Returns(value: null);

查询类:

public class GetApplicationByNameQuery : IQuery<Application, Application?>
{
private readonly string _name;
public GetApplicationByNameQuery(string name)
{
_name = name;
}
public Application? Execute(IQueryable<Application> queryable)
{
return queryable.SingleOrDefault(x => x.Name == _name);
}
}

GetBrowserByNameQuery需要一个字符串,我没有成功测试传递给GetBrowserByNameQuery的字符串。

下面的例子不起作用,因为它是GetBrowserByNameQuery的另一个实例

context.Setup(x => x.ExecuteQuery(new GetBrowserByNameQuery>(command.Name))).Returns(value: null);

您可以尝试以下方法:

GetBrowserbyNameQuery resultQuery = null;
context
.Setup(x => x.ExecuteQuery(It.IsAny<GetBrowserByNameQuery>()))
.Returns(value: null)
.Callback<GetBrowserByNameQuery>(query => { resultQuery = query; });

现在在resultQuery中,您有一个实际的类实例,它被用作参数。并且可以使用断言库断言(如果类具有Name的一些公共属性)。例如FluentAssertions:

resultQuery.Name.Should().Be(command.Name)

如果GetBrowserByNameQuery不暴露Name,没有简单的方法来检查它。构造函数不能模拟,所以只有选项:

  • 通过反射访问私有字段,这是超级丑陋的,违反了单元测试原则
  • 用factory封装GetBrowserByNameQuery的创建,然后模拟工厂并检查是否用正确的参数调用了工厂方法

最新更新