c# - 在 Moq Callback() 调用中设置变量值

标签 c# .net unit-testing mocking moq

我想我可能对 Moq 回调方法的语法有点困惑。当我尝试做这样的事情时:

IFilter filter = new Filter();
List<IFoo> objects = new List<IFoo> { new Foo(), new Foo() };  

IQueryable myFilteredFoos = null;
mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
   .Callback( (IFilter filter) => myFilteredFoos = filter.FilterCollection(objects))
   .Returns(myFilteredFoos.Cast<IFooBar>());

这会引发异常,因为 myFilteredFoosCast<IFooBar>() 期间为空称呼。这不符合我的预期吗?我会想 FilterCollection将被调用然后myFilteredFoos将是非空的并允许类型转换。

FilterCollection无法返回空值,这让我得出它没有被调用的结论。另外,当我声明 myFilteredFoos像这样:

Queryable myFilteredFoos;

Return 调用提示 myFilteredFoos 可能在初始化之前被使用。

最佳答案

这是因为 Returns 方法中的代码是立即计算的;也就是说,当调用 Setup 方法时。

但是,在调用 GetByFilter 方法之前不会调用回调。

幸运的是,Returns 方法被重载,因此您也可以推迟它的执行:

mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
    .Callback((IFilter filter) =>
        myFilteredFoos = filter.FilterCollection(objects))
    .Returns(() => myFilteredFoos.Cast<IFooBar>());

但是,您不需要将值保存在回调中,因为您可以直接在Returns 方法中获取参数值:

mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
    .Returns((IFilter filter) =>
        filter.FilterCollection(objects).Cast<IFooBar>());

关于c# - 在 Moq Callback() 调用中设置变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2494930/

相关文章:

c# - 如何在 C# 中以编程方式读取日志文件信息的 sql server mdf header

c# - 列出/详细说明不同的窗口是否可以同步并数据绑定(bind)到同一个集合?

c# - Twitterizer- 远程服务器返回错误 : (401) Unauthorized

java - 我们可以根据 id 以外的任何其他唯一字段更新 Keycloak 中的用户吗?

angular - 如何在 Angular 中对 NGXS 进行单元测试?

javascript - 看不到 axios 调用后呈现的组件内容

c# - Linq、DLinq 和 XLinq 之间有什么区别?

c# - 是否可以在项目中使用同一个库的多个版本?

c# - 如何使用 EF Code First 声明一对多关系?

python - 基于输入参数模拟python函数