簡體   English   中英

NSubstitute模擬一個沒有out / ref參數的void方法

[英]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參數。 由於該參數不是refout ,因此在模擬成員中更改數組引用不會對調用代碼產生任何影響。 因此,您有效地做到了:

class TheMoc : IRandomNumberGenerator
{
    public void NextBytes(byte[] bytes)
    {
        bytes = new byte[] {0x4d, 0x65, 0x64, 0x76};
    }
}

當然,這不會反映在調用代碼中。 這就是NSubsitute給您例外的原因。

話雖如此,並不清楚為什么要這么做,因為調用代碼將永遠不會反映出接口對該數組的實際實現。

因此,當您的調用代碼如下所示:

theGenerator.NextBytes(bytes);

該代碼仍將引用“舊”數組,而不是“新”數組(您嘗試嘲笑)。

所以,你需要提供帕拉姆作為refout以反映您的調用代碼修改。

如果您知道數組將始終包含四個元素,則可以修改數組內容 ,而不是其引用

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.

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