gpt4 book ai didi

.net - NSubstitute 是否支持 ref 参数?

转载 作者:行者123 更新时间:2023-12-04 17:28:14 25 4
gpt4 key购买 nike

我的 iterface 中有以下方法签名:

void SetItem(ref AddressItem item);

我做了这样的参数约束:
IAddAddressForm form = Substitute.For<IAddAddressForm>();
AddressItem item = null;
form.SetItem(Arg.Is(item));

但由于裁判失败了。如果我把 ref 拿出来,它就可以正常工作。但我需要在这里通过引用。

任何想法如何得到这个?

旁注:如果传入的值为空,我的最终目标是在 SetItem 中引发异常。如果你能提供帮助,那么你会得到额外的积分!

最佳答案

NSubstitute 不直接支持 arg 匹配 ref 参数,但通常它可以与它们一起使用。

我假设你必须使用 ref如您的问题所述,但显然如果您可以避免ref你的 API 会更简单,测试也会更简单(不管你使用什么框架)。

在回答您的直接问题时,您可以通过将第二个代码示例更新为:

form.SetItem(ref item);

对于您的旁注,请确保您没有试图将过多的行为强加给您的替代品。我发现每当我这样做时,这表明我需要简化我正在测试的类与其依赖项之间的通信。 (或者如果我真的需要一个假对象中的大量逻辑,我将手动编写代码而不是生成它;它通常可以更简单。)

有几种方法可以让这个调用抛出异常:
form.When(x => x.SetItem(ref item)).Do(x => { throw new ArgumentNullException(); });

仅当使用 null ref 调用时才会抛出异常。您还可以根据传递的参数有选择地添加此行为,尽管我建议您不要这样做,因为这可能表明您对替代品的投入过多。
form.WhenForAnyArgs(x => x.SetItem(ref item))
.Do(x => {
if (x[0] == null)
throw new ArgumentNullException();
});

最后,如果您只想检查您正在测试的类在 IAddAddressForm 抛出 arg null 异常时是否正确响应,我可能会这样做:
form
.WhenForAnyArgs(x => x.SetItem(ref item))
.Do(x => { throw new ArgumentNullException(); });

这样你就不会真正关心参数是什么,你只是想确保你正在测试的代码能正确地对这种情况使用react。

希望这可以帮助。

边注:

如果您想为 Arg.Any<AddressItem>() 使用 arg 匹配器(如 out )或 ref参数,您需要在调用本身之外定义它(这可能有点容易出错:您需要确保以与它们进入调用相同的顺序定义匹配器):
        IAddAddressForm form = Substitute.For<IAddAddressForm>();
AddressItem item = Arg.Is<AddressItem>(y => y.Number == 14);
form
.When(x => x.SetItem(ref item))
.Do(x => { throw new ArgumentNullException(); });
var address = new AddressItem { Number = 14 };
form.SetItem(ref address);

关于.net - NSubstitute 是否支持 ref 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3790000/

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