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
的创建,然后模拟工厂并检查是否用正确的参数调用了工厂方法