[英]NSubstitute mock a void method without out/ref parameters
我試圖模擬沒有'out'或'ref'參數的void方法,但無法模擬它。 我想在模擬函數中修改參數
public interface IRandomNumberGenerator
{
void NextBytes(byte[] buffer);
}
var randomImplementation = Substitute.For<IRandomNumberGenerator>();
randomImplementation.When(x => x.NextBytes(Arg.Any<byte[]>())).Do(x =>
{
x[0] = new byte[] {0x4d, 0x65, 0x64, 0x76};
});
但是當我運行此測試時出現錯誤:
NSubstitute.Exceptions.ArgumentIsNotOutOrRefException:'無法設置參數0(Byte []),因為它不是out或ref參數。
還有其他方法可以更改void方法中的參數嗎?
x[0]
引用傳遞給NextBytes
的第一個參數,在您的情況下為buffer
參數。 由於該參數不是ref
或out
,因此在模擬成員中更改數組引用不會對調用代碼產生任何影響。 因此,您有效地做到了:
class TheMoc : IRandomNumberGenerator
{
public void NextBytes(byte[] bytes)
{
bytes = new byte[] {0x4d, 0x65, 0x64, 0x76};
}
}
當然,這不會反映在調用代碼中。 這就是NSubsitute給您例外的原因。
話雖如此,並不清楚為什么要這么做,因為調用代碼將永遠不會反映出接口對該數組的實際實現。
因此,當您的調用代碼如下所示:
theGenerator.NextBytes(bytes);
該代碼仍將引用“舊”數組,而不是“新”數組(您嘗試嘲笑)。
所以,你需要提供帕拉姆作為ref
或out
以反映您的調用代碼修改。
如果您知道數組將始終包含四個元素,則可以修改數組內容 ,而不是其引用 :
randomImplementation.When(x => x.NextBytes(Arg.Any<byte[]>())).Do(x =>
{
x[0][0] = 0x4d;
x[0][1] = 0x65;
x[0][2] = 0x64;
x[0][3] = 0x76;
});
因此,您不想匹配對NextBytes
任何調用,而只匹配那些提供四個字節的數組的調用,從而使Arg.Any<byte[]()>
有效地成為Arg.Is<byte[]>(x => x.Lengh == 4)
。
多虧了HimBromBeere,我才知道我做錯了什么。
所以簡單地我不能用新的填充字節數組傳遞,我需要替換數組中的每個項目
public interface IRandomNumberGenerator
{
void NextBytes(byte[] buffer);
}
var randomImplementation = Substitute.For<IRandomNumberGenerator>();
randomImplementation.When(x => x.NextBytes(Arg.Any<byte[]>())).Do(x =>
{
var byteArray = x.Arg<byte[]>();
byteArray [0] = 0x4d;
byteArray [1] = 0x65;
byteArray [2] = 0x64;
byteArray [3] = 0x76;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.