【问题标题】:Settings variable values in a Moq Callback() call在 Moq Callback() 调用中设置变量值
【发布时间】:2011-01-30 11:55:51
【问题描述】:

我想我可能对 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>());

这会引发异常,因为在Cast&lt;IFooBar&gt;() 调用期间myFilteredFoos 为空。这不按我的预期工作吗?我认为FilterCollection 会被调用,然后myFilteredFoos 将是非空的并允许演员。

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

Queryable myFilteredFoos;

Return 调用抱怨 myFilteredFoos 在初始化之前可能会被使用。

【问题讨论】:

    标签: c# .net unit-testing mocking moq


    【解决方案1】:

    这是因为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>());
    

    【讨论】:

      【解决方案2】:

      你可以只取返回值中的参数...

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

      【讨论】:

      • 是的。这就是我想要的:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 2016-08-06
      • 1970-01-01
      相关资源
      最近更新 更多