我的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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top