簡體   English   中英

N替代,輸出參數和條件返回

[英]NSubstitute, out Parameters and conditional Returns

我有一個與以下我想在NSubstitute中模擬的場景相同的場景...

public interface IGrabSomeData
{
    bool GrabThatData(string filename, out byte[] data);
}

...使用此接口,我希望它使用文件名並獲取字節數據。 我想使用NSubstitute傳遞特定的文件名,並返回不同的或空的字節數組。 通常,我會通過在腳手架中指定參數並適當使用'Returns'元素來進行此操作。 不幸的是,我無法使用'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.

提前致謝。

這未經測試,但也許可以利用“ Arg.Is <>”,如本例所示:

IGrabSomeData grabSomeData_1 = Substitute.For<IGrabSomeData>();

byte[] empty = { };
grabSomeData_1.GrabThatData(Arg.Is<string>(x => string.Equals(x, "test1.xml")), out empty).Returns(x => { x[1] = new byte[] { 0, 1, 2 }; return true; });
grabSomeData_1.GrabThatData(Arg.Is<string>(x => string.Equals(x, "test2.xml")), out empty).Returns(x => { x[1] = new byte[] { 0, 1, 2, 3, 4 }; return true; });
grabSomeData_1.GrabThatData(Arg.Is<string>(x => string.Equals(x, "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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM