在带有输出参数的 NSubstitute 模拟方法中返回不同的值

2023-12-20

给出一种模拟方法...

public bool TryReceive(out T message, TimeSpan millisecondsToWait)
  • 我希望在前两次调用中设置不同的消息,然后返回 真的。
  • 后续调用将返回 false。

我尝试了一些变体,无论哪种情况,lambda 表达式执行一次,再也不会了。 N替代品似乎是缓存第一个返回值,并反复使用相同的值。

我已经尝试过这个...

TCR @out;
var container = new AutoSubstitute();
var mb = container.Resolve<IMessageBuffer<TCR>>();
mb.TryReceive(out @out, Arg.Any<TimeSpan>()).Returns(
            _ => { _[0] = buy; return true; },
            _ => { _[0] = sell; return true; },
            _ => { _[0] = null; return false; });

我已经尝试过这个:

        bool? bs = true;
        TCR @out;
        var container = new AutoSubstitute();
        var mb = container.Resolve<IMessageBuffer<TCR>>();
        mb.TryReceive(out @out, Arg.Any<TimeSpan>()).Returns(
            _ =>
            {
                if (bs == true)
                {
                    _[0] = buy;
                    bs = false;
                    return true;
                }
                if (bs == false)
                {
                    _[0] = sell;
                    bs = null;
                    return true;
                }
                _[0] = null;
                return false;
            });

我能想到的唯一选择是提供缓冲区的完整替代实现以用于测试目的。我的感觉是鉴于此文档 http://nsubstitute.github.io/help/setting-out-and-ref-arguments/,应该是可以的。

edit

我无法使用 NSubstitute 来实现这一点,但是如果我提供一个模拟实现IMessageBuffer<TCR> using

// mock buffer will return the necessary values by maintaining
// the relevant state internally.
container.Provide<IMessageBuffer<TCR>>(new MockBuffer());

它工作正常,所以这不是一个生命周期问题。不知何故, NSubstitute 似乎只在第一次调用模拟出的方法,并重用该值(或以这样的方式操作)seems重用该值) - 很奇怪。


NSubstitute 有点挣扎out and ref参数。

问题是当我们存根时:

mb.TryReceive(out @out, Arg.Any<TimeSpan>()).Returns(...)

这只会在以下情况下执行@out是原始值。这个值会在第一次调用时改变,所以Returnslambda 不会再次执行(NSub 认为这是一个不同的、不匹配的调用)。

解决此问题的最简单方法是切换到ReturnsForAnyArgs(...):

mb.TryReceive(out @out, Arg.Any<TimeSpan>()).ReturnsForAnyArgs(action0, action1, action2);

这对所有人都有效TryReceive调用,无论参数值如何,因此 lambda 应始终执行。这样做的缺点是,如果您希望它仅针对第二个参数的特定值运行,那么您必须将该逻辑放入 lambda 中(而不是使用参数匹配器)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在带有输出参数的 NSubstitute 模拟方法中返回不同的值 的相关文章

随机推荐