代码之家  ›  专栏  ›  技术社区  ›  Adam Driscoll

在moq callback()调用中设置变量值

  •  58
  • Adam Driscoll  · 技术社区  · 14 年前

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

    这引发了一个异常,因为 myFilteredFoos 在期间为空 Cast<IFooBar>() 打电话。这不是我期望的那样有效吗?我会想 FilterCollection 会被叫来然后 我筛选的foos 将为非空并允许强制转换。

    筛选集合 无法返回空值,这将使我得出不调用它的结论。另外,当我宣布 我筛选的foos 这样地:

    Queryable myFilteredFoos;
    

    返回调用抱怨myfilteredfoos在初始化之前可能会被使用。

    2 回复  |  直到 11 年前
        1
  •  86
  •   Mark Seemann    14 年前

    这是因为 Returns 方法被立即评估;也就是说,当 Setup 正在调用方法。

    但是,在 GetByFilter 方法被调用。

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

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

    但是,您不需要在回调中保存该值,因为您可以直接在 退换商品 方法:

    mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
        .Returns((IFilter filter) =>
            filter.FilterCollection(objects).Cast<IFooBar>());
    
        2
  •  17
  •   MaxGuernseyIII    14 年前

    您只需在返回值中获取参数…

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