我有一个与下面我想在 NSubstitute 中模拟的场景没有什么不同......
public interface IGrabSomeData
{
bool GrabThatData(string filename, out byte[] data);
}
...使用此接口,我希望它采用文件名并检索字节数据。使用 NSubstitute 我想向它传递特定的文件名并返回不同的或空的字节数组。通常,我会通过在我的脚手架中指定参数并酌情使用“返回”元素来执行此操作。不幸的是,我不能使用“Arg.Any()”参数,因为它提供了......
ref 或 out 参数必须是可赋值变量
...但是如果我这样做,它始终是一个空字节数组。这是使用上面接口的快速演示...
IGrabSomeData grabSomeData_1 = Substitute.For<IGrabSomeData>();
IGrabSomeData grabSomeData_2 = Substitute.For<IGrabSomeData>();
// Doesn't work
byte[] empty = { };
grabSomeData_1.GrabThatData(Arg.Any<string>(), out empty).Returns(x => { x[1] = new byte[] { 0, 1, 2 }; return true; });
byte[] test1 = {};
var result1 = grabSomeData_1.GrabThatData("" , out test1);
Assert.IsTrue( test1.length > 0); // FAILS
// Does work
grabSomeData_2.GrabThatData(Arg.Any<string>(), out empty).ReturnsForAnyArgs(x => { x[1] = new byte[] { 0, 1, 2 }; return true; });
byte[] test2 = { };
var result2 = grabSomeData_2.GrabThatData("", out test2);
Assert.IsTrue(empty.Length > 0); // Success!
简而言之,我需要声明“out”参数,但我必须为我的模拟调用分配一个变量——这在特定的“Returns”语句中无法识别。是否有可能实现类似...
IGrabSomeData grabSomeData_1 = Substitute.For<IGrabSomeData>();
byte[] empty = { };
grabSomeData_1.GrabThatData("test1.xml", out empty).Returns(x => { x[1] = new byte[] { 0, 1, 2 }; return true; });
grabSomeData_1.GrabThatData("test2.xml", out empty).Returns(x => { x[1] = new byte[] { 0, 1, 2, 3, 4 }; return true; });
grabSomeData_1.GrabThatData("test3.xml", out empty).Returns(x => { x[1] = new byte[] { 0, 1 }; return true; });
byte[] test1 = {};
var result1 = grabSomeData_1.GrabThatData("test1.xml", out test1);
Assert.IsTrue(test1.Length == 2);
// etc.
提前致谢。