FakeItEasy使用out参数返回Lazily

时间:2013-08-30 07:47:28

标签: fakeiteasy out-parameters

我是新手使用FakeItEasy而是坚持第一次尝试。我想伪造的界面有这样的方法:

byte[] ReadFileChunk(string path,int offset,int count,out long size);

我想看看如何传递参数,所以我使用ReturnsLazily。这是我的尝试:

long resSize;
A.CallTo(() => dataAttributesController
     .ReadFileChunk(A<string>.Ignored, A<int>.Ignored, A<int>.Ignored, out resSize))
     .ReturnsLazily((string path, int offset, int count) =>
        {
             return Encoding.UTF8.GetBytes("You requested: " + path + "(" + offset + "," + count + ")");
        })
    .AssignsOutAndRefParameters(123);

这会编译,但运行时会生成此异常:

The faked method has the signature (System.String, System.Int32, System.Int32, System.Int64&), but returns lazily was used with (System.String, System.Int32, System.Int32).

哪个是正确的,但我无法弄清楚如何添加out参数。如果我将ReturnLazily部分更改为:

.ReturnsLazily((string path, int offset, int count, out long size) =>
   {
      size = 0;
      return Encoding.UTF8.GetBytes("You requested: " + path + "(" + offset + "," + count + ")");
   })

它不会编译,我不明白错误:

error CS1593: Delegate 'System.Func<FakeItEasy.Core.IFakeObjectCall,byte[]>' does not take 4 arguments
error CS1661: Cannot convert lambda expression to delegate type 'System.Func<string,int,int,long,byte[]>' because the parameter types do not match the delegate parameter types
error CS1677: Parameter 4 should not be declared with the 'out' keyword

对于像我这样的新手来说,这听起来好像不喜欢4个参数,也不知道怎么处理'out'。有人可以解释一下我应该如何阅读这些错误吗?一个工作的例子也非常受欢迎: - )

非常感谢!

---编辑---

这似乎有效:

A.CallTo(() => dataAttributesController
    .ReadFileChunk(A<string>.Ignored, A<int>.Ignored, A<int>.Ignored, out resSize))
    .ReturnsLazily(x =>
           Encoding.UTF8.GetBytes("You requested: " + x.Arguments.Get<string>(0) + "(" + x.Arguments.Get<int>(1) + "," + x.Arguments.Get<int>(2) + ")"))
    .AssignsOutAndRefParameters((long)123);

比我希望的那样可读性稍差,这是否接近ReturnLazily的预期用途?

2 个答案:

答案 0 :(得分:3)

您的界面是否受您控制?

byte[] ReadFileChunk(string path, int offset, int count, out long size);

如果是这样的话:out long size与返回byte[]的大小不一样吗? 在这种情况下,我只是从接口方法中删除size参数,并按照您的意图使用“精美阅读”ReturnsLazily方法。

答案 1 :(得分:1)

更新:我在下面提到的问题在FakeItEasy版本1.15中修复,因此请更新到最新版本,在使用ReturnsLazily时,您不必担心方法的out / ref说明符

抱歉延误。我很高兴您找到了至少适合您的解决方案。

我同意您登录的语法不是最易读的,但它看起来确实是正确的。 ReturnsLazily的“便利”版本不适用于out / ref参数,因为lambda不能使用out / ref修饰符。

今天对你没有帮助,但我已经创建了FakeItEasy issue 168来解决这个问题。如果您有其他意见,请随时留言并发表评论。