首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用out参数在NSubstitute模拟方法中返回不同的值

使用out参数在NSubstitute模拟方法中返回不同的值
EN

Stack Overflow用户
提问于 2016-06-28 11:52:47
回答 1查看 1.9K关注 0票数 2

给出了一种方法来模仿..。

代码语言:javascript
复制
public bool TryReceive(out T message, TimeSpan millisecondsToWait)
  • 我希望在前两个调用中设置不同的消息,并返回true。
  • 随后的调用返回false。

我尝试过几种变体,在这两种情况下,lambda表达式只执行一次,然后再执行一次。NSubstitute似乎是缓存第一个返回值,并一次又一次地使用相同的值。

我试过这个..。

代码语言:javascript
复制
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; });

我试过这样做:

代码语言:javascript
复制
        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;
            });

我能想到的唯一选择是为测试目的提供缓冲区的一个完整的替代实现。我的感觉是,考虑到这个文档,它应该是可能的。

编辑

但是,如果我使用NSubstitute提供IMessageBuffer<TCR>的模拟实现,则无法使用

代码语言:javascript
复制
// mock buffer will return the necessary values by maintaining
// the relevant state internally.
container.Provide<IMessageBuffer<TCR>>(new MockBuffer());

它的工作正常,所以这不是一个生命录像的问题。不知怎么的,NSubstitute似乎只是第一次调用模拟的out方法,并且重用了这个值(或者以这样的方式操作,以至于它似乎重用了这个值)--非常奇怪。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-29 04:33:50

NSubstitute在outref参数方面有点挣扎。

问题是当我们存根时:

代码语言:javascript
复制
mb.TryReceive(out @out, Arg.Any<TimeSpan>()).Returns(...)

这只在@out是原始值时才会执行。该值将在第一次调用时更改,因此Returns lambda不会再次执行(NSub认为它是一个不同的、不匹配的调用)。

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

代码语言:javascript
复制
mb.TryReceive(out @out, Arg.Any<TimeSpan>()).ReturnsForAnyArgs(action0, action1, action2);

这将适用于所有TryReceive调用,而不管参数值如何,因此lambda应该始终执行。这样做的缺点是,如果只希望运行第二个参数的特定值,则必须将该逻辑放入lambda (而不是使用参数匹配器)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38075513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档