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