我是新手使用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的预期用途?
答案 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来解决这个问题。如果您有其他意见,请随时留言并发表评论。