Nsubstitute是否支持Ref参数?
-
05-10-2019 - |
题
我的iTerface中有以下方法签名:
void SetItem(ref AddressItem item);
我这样做的参数约束:
IAddAddressForm form = Substitute.For<IAddAddressForm>();
AddressItem item = null;
form.SetItem(Arg.Is(item));
但这是由于参考而失败的。如果我取出裁判,则可以正常工作。但是我需要在这里参考。
有什么想法如何得到这个?
旁注:我的最终目标是如果传递的价值为无效,则在setItem中提出异常。如果您能提供帮助,那么您将获得更多积分!
解决方案
Nsubstitute对ARG匹配参数没有直接的支持,但总的来说,它可以与他们合作。
我要假设你必须使用 ref
如您的问题所述,但是显然您是否可以避免 ref
您的API会更简单,并且对其进行测试(不论您使用的框架如何)。
在回答您的直接问题时,您可以通过将第二个代码示例更新为:
form.SetItem(ref item);
对于您的附带说明,请确保您不要试图将过多的行为推向替代。我发现,每当我这样做时,我都需要简化正在测试的类及其依赖项之间的通信。 (或者,如果我真的需要假对象中的大量逻辑,我将对一个代码而不是生成;它通常更简单。)
有几种方法可以通话以引发例外:
form.When(x => x.SetItem(ref item)).Do(x => { throw new ArgumentNullException(); });
只有在用零涉及的情况下调用时,这才会抛出异常。您还可以根据通过的参数选择性地添加此行为,尽管我建议您反对这一点,因为这可能是您将过多的替代品推入替代品的信号。
form.WhenForAnyArgs(x => x.SetItem(ref item))
.Do(x => {
if (x[0] == null)
throw new ArgumentNullException();
});
最后,如果您只想检查当您正在测试的课程是否正确响应时,当iAddaddaddressform抛出ARG NULL异常时,我可能会这样做:
form
.WhenForAnyArgs(x => x.SetItem(ref item))
.Do(x => { throw new ArgumentNullException(); });
这样,您就不会真正关心论点是什么,您只想确保您正在测试的代码对此情况做出正确的反应。
希望这可以帮助。
边注:
如果您想使用ARG Matcher(例如 Arg.Any<AddressItem>()
) 为 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);
不隶属于 StackOverflow