gpt4 book ai didi

c# - 在 Moq Callback() 调用中设置变量值

转载 作者:IT王子 更新时间:2023-10-29 03:45:41 26 4
gpt4 key购买 nike

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

这会引发异常,因为 myFilteredFoosCast<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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com