Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NSubstitute mock无out/ref参数的void方法_C#_Nsubstitute - Fatal编程技术网

C# NSubstitute mock无out/ref参数的void方法

C# NSubstitute mock无out/ref参数的void方法,c#,nsubstitute,C#,Nsubstitute,我试图模拟一个没有'out'或'ref'参数的void方法,但我无法模拟它。 我想修改mock函数中的参数 public interface IRandomNumberGenerator { void NextBytes(byte[] buffer); } var randomImplementation = Substitute.For<IRandomNumberGenerator>(); randomImplementation.When(x => x.N

我试图模拟一个没有'out'或'ref'参数的void方法,但我无法模拟它。 我想修改mock函数中的参数

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};
});
但当我运行此测试时,出现了错误:

NSSubstitute.Exceptions.ArgumentIsNotOutOrRefException:'无法设置 参数0字节[],因为它不是out或ref参数。'

是否有其他可能更改void方法内部的参数?

x[0]引用传递给NextBytes的第一个参数,在您的例子中是buffer参数。由于参数不是ref或out,在模拟成员中更改数组引用不会对调用代码产生任何影响。因此,有效地做到这一点:

class TheMoc : IRandomNumberGenerator
{
    public void NextBytes(byte[] bytes)
    {
        bytes = new byte[] {0x4d, 0x65, 0x64, 0x76};
    }
}
这当然不会反映在调用代码中。这就是nsubstitute为您提供异常的原因

说到这里,我们还不清楚为什么要这样做,因为您调用的代码永远不会反映接口的实际实现对该数组所做的任何操作

因此,当您的呼叫代码如下所示:

theGenerator.NextBytes(bytes);
该代码仍将引用旧数组,而不是您试图模仿的新数组

因此,您需要提供参数作为ref或out,以在调用代码中反映该修改

如果知道数组始终有四个元素,则只需修改数组内容,而不是其引用:

因此,您不希望匹配任何对NextBytes的调用,而只希望匹配那些提供四个字节数组的调用,从而使您的Arg.any有效地成为Arg.Isx=>x.Lengh==4。

多亏了HimBromBeere,我才明白我做错了什么

所以我不能用new传递填充字节数组,我需要替换数组中的每个项

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;
});

您似乎想要替换整个数组,这当然需要参数为ref或out。但是,您可以尝试替换数组元素。例如,如何将buffer转换为具有字节数组属性的对象,并像buffer.bytes=new byte[]{…}那样访问它?传递对象在C中是如何工作的。您如何调用该代码?你能分享你调用NextBytes的部分吗?@HimBromBeere我有两个实现,一个是Random.NextBytes,第二个是更安全的加密,所以调用这样的核心是这样的:var bytesArray=new byte[bytesize]_randomNumberGenerator.nextBytes字节数组;问题是,无论生成器实际执行什么操作,除非bytesArray没有通过ref传递,否则调用NextBytes的代码根本无法识别它。
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;
});