3

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

比我希望的可读性差一点,这是否接近 ReturnsLazily 的预期用途?

4

2 回答 2

3

该界面在您的控制之下吗?

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

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

于 2013-09-05T06:20:57.233 回答
1

更新:我在下面提到的问题已在 FakeItEasy 版本 1.15 中修复,因此更新到最新版本,您不必担心使用ReturnsLazily.

抱歉耽搁了。我很高兴您找到了至少对您有用的解决方案。

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

今天它对你没有帮助,但我创建了FakeItEasy 问题 168来解决这个问题。如果您有其他意见,请顺路并发表评论或其他内容。

于 2013-08-31T11:06:16.357 回答