设置 Moq Callback()调用中的变量值

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

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<IFooBar>()调用期间 myFilteredFoos为 null。这不是我想要的效果吗?我认为 FilterCollection将被调用,然后 myFilteredFoos将是非空的,并允许转换。

FilterCollection不能返回 null,这使我得出结论,它没有被调用。另外,当我像这样声明 myFilteredFoos时:

Queryable myFilteredFoos;

Return 调用抱怨在初始化之前可能使用 myFilteredFos。

53153 次浏览

你只需要在返回值中获取参数..。

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


return myFilteredFoos.Cast<IFooBar>();
});

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