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

时间:2015-07-14 23:36:37

标签: c# fakeiteasy

使用NUnit 2.6.4&amp; FakeItEasy 1.25.2在Visual Studio 2013社区版中单元测试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报告的错误,还是我错过了什么?

THX

1 个答案:

答案 0 :(得分:2)

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

是的,它是一个错误,似乎已在1.23.0中引入。 我创建了issue 508。 我将在不久的将来处理修复工作,并将与其他项目所有者讨论我们要发布修复程序的版本。如果你有意见,请继续。

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

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