A.Fake<Stream>().Read(...) throwing InvalidOperationEx

本文关键字:Read throwing InvalidOperationEx Stream Fake lt gt | 更新日期: 2023-09-27 18:02:47

使用NUnit 2.6.4 &FakeItEasy 1.25.2在Visual Studio 2013 Community Edition中对c#代码进行单元测试

下面的测试片段按预期执行

[Test]
public void test_whatIsUpWithStreamRead()
{
    Stream fakeStream = A.Fake<Stream>();
    byte[] buffer = new byte[16];
    int numBytesRead = fakeStream.Read(buffer, 0, 16);
    Assert.AreEqual(0, numBytesRead);
}

然而,只要我用CallTo/Returns()或ReturnsLazily()语句装饰我的假…

[Test]
public void test_whatIsUpWithStreamRead()
{
    Stream fakeStream = A.Fake<Stream>();
    A.CallTo(() => fakeStream.Read(A<byte[]>.Ignored, A<int>.Ignored, A<int>.Ignored)).Returns(1);
    byte[] buffer = new byte[16];
    int numBytesRead = fakeStream.Read(buffer, 0, 16);
    Assert.AreEqual(1, numBytesRead);
}

fakeStream.Read()抛出一个System。InvalidOperationException的消息:

"指定的out和ref参数的个数与调用中的out和ref参数的个数不匹配。"

来自FakeItEasy.Configuration.BuildableCallRule.ApplyOutAndRefParametersValueProducer(IInterceptedFakeObjectCall fakeObjectCall),这对我来说很奇怪,因为Stream.Read()没有任何out/ref参数。

这是一个bug,我应该在https://github.com/FakeItEasy报告,还是我错过了什么?

thx

A.Fake<Stream>().Read(...) throwing InvalidOperationEx

更新:该错误已在FakeItEasy 1.25.3和FakeItEasy 2.0.0中修复。


是的,这是一个错误,似乎是在1.23.0中引入的。我创造了第508期。我将在不久的将来修复工作,并将与其他项目所有者讨论在哪个版本中我们想要发布修复。如果你有什么意见,就过来吧。

与此同时,一个可能的解决方案是回滚到FakeItEasy 1.22.0,如果你不需要在后续版本中添加的任何增强和错误修复。

如果这不是一个选项,也许可以考虑抽象掉Stream.Read并伪造抽象。或者回来,我很乐意讨论其他途径