我想我可能对 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
将被调用然后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/