在Moq Callback()调用中设置variables值

我想我可能对Moqcallback方法的语法有些困惑。 当我尝试做这样的事情:

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>()); 

这将抛出exception,因为在调用Cast<IFooBar>()期间myFilteredFoos为null。 这是不是像我所期望的那样工作? 我会认为FilterCollection将被调用,然后myFilteredFoos将是非空的,并允许投。

FilterCollection不能够返回一个null,这引出了我没有被调用的结论。 另外,当我声明myFilteredFoos是这样的:

 Queryable myFilteredFoos; 

返callback用声明myFilteredFoos可能在初始化之前使用。

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

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

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

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

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

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

你可以把参数的返回值…

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