给出了一种方法来模仿..。
public bool TryReceive(out T message, TimeSpan millisecondsToWait)我尝试过几种变体,在这两种情况下,lambda表达式只执行一次,然后再执行一次。NSubstitute似乎是缓存第一个返回值,并一次又一次地使用相同的值。
我试过这个..。
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;
});我能想到的唯一选择是为测试目的提供缓冲区的一个完整的替代实现。我的感觉是,考虑到这个文档,它应该是可能的。
编辑
但是,如果我使用NSubstitute提供IMessageBuffer<TCR>的模拟实现,则无法使用
// mock buffer will return the necessary values by maintaining
// the relevant state internally.
container.Provide<IMessageBuffer<TCR>>(new MockBuffer());它的工作正常,所以这不是一个生命录像的问题。不知怎么的,NSubstitute似乎只是第一次调用模拟的out方法,并且重用了这个值(或者以这样的方式操作,以至于它似乎重用了这个值)--非常奇怪。
发布于 2016-06-29 04:33:50
NSubstitute在out和ref参数方面有点挣扎。
问题是当我们存根时:
mb.TryReceive(out @out, Arg.Any<TimeSpan>()).Returns(...)这只在@out是原始值时才会执行。该值将在第一次调用时更改,因此Returns lambda不会再次执行(NSub认为它是一个不同的、不匹配的调用)。
解决这个问题的最简单的方法是切换到ReturnsForAnyArgs(...)。
mb.TryReceive(out @out, Arg.Any<TimeSpan>()).ReturnsForAnyArgs(action0, action1, action2);这将适用于所有TryReceive调用,而不管参数值如何,因此lambda应该始终执行。这样做的缺点是,如果只希望运行第二个参数的特定值,则必须将该逻辑放入lambda (而不是使用参数匹配器)。
https://stackoverflow.com/questions/38075513
复制相似问题