A.Fake <Stream>().读取(...)抛出InvalidOperationException

Ric*_*ang 6 c# fakeiteasy

使用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);

}
Run Code Online (Sandbox Code Playgroud)

但是只要我用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);

}
Run Code Online (Sandbox Code Playgroud)

fakeStream.Read() 抛出System.InvalidOperationException并显示以下消息:

"指定的out和ref参数的值的数量与调用中的out和ref参数的数量不匹配."

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

这是我应该在https://github.com/FakeItEasy上报告的错误,还是我错过了什么?

谢谢

Bla*_*rad 2

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


是的,这是一个错误,似乎是在 1.23.0 中引入的。我创建了问题 508。我将在不久的将来进行修复,并将与其他项目所有者讨论我们希望在哪个版本中发布修复。如果你有意见就过来吧。

同时,如果您不需要后续版本中添加的任何增强功能和错误修复,一种可能的解决方法是回滚到 FakeItEasy 1.22.0。

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