A.Fake<Stream>().Read(...)抛出InvalidOperationException异常

6

使用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参数。
我应该在https://github.com/FakeItEasy报告这个问题吗?还是我漏掉了什么?
谢谢。

我不确定你是否看到了更新,但我们相信FakeItEasy 1.25.3中的问题已经解决。 - Blair Conrad
1个回答

2
更新:该缺陷已在FakeItEasy 1.25.3FakeItEasy 2.0.0中得到修复。
是的,这是一个bug,在1.23.0版本中似乎引入了该问题。作者创建了issue 508。作者会尽快解决此问题,并将与其他项目所有者讨论何时发布修复版本。如果您有任何意见,请前往该页面进行讨论。
与此同时,一个可能的解决方案是回滚到FakeItEasy 1.22.0,如果您不需要在随后的版本中添加的增强功能和错误修复。
如果这不是一个选择,请考虑抽象化Stream.Read并模拟该抽象层。或者回来与作者讨论其他可行方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接