rhino和抽象基类

本文关键字:基类 抽象 rhino | 更新日期: 2023-09-27 18:18:50

我正在尝试使用System.Security.Cryptography进行模拟。RandomNumberGenerator,不幸的是它是一个抽象基类,而不是一个接口。

当我尝试在Rhino中设置期望时。模拟:

int iterations = 10 ;
byte[] fakeHash = {0, 1, 3, 6};
mocks.Get<HashAlgorithm>().Expect(x => x.ComputeHash(Arg<byte[]>.Is.NotNull))
    .Return(fakeHash).Repeat.Times(iterations);

从ABC抛出一个异常:

测试方法Tests.Utils.FooTest.BarTest抛出异常:System。ArgumentNullException:值不能为空。参数名称:buffer atSystem.Security.Cryptography.HashAlgorithm。哈希(Byte[]缓冲)

ABC强制执行传递的参数不为空的不变性,但是Rhino传递的是空值。注意,这是作为期望/存根的设置的一部分,而不是作为测试的一部分调用时的

我怎么能解决这个问题,但仍然得到的期望,方法将被调用,和假的结果,我想要的?当然,我可以创建自己的模拟类,但我更愿意找到一种不需要这样做的方法。

谢谢。

rhino和抽象基类

抛出异常,因为ComputeHash不是虚成员。只能对虚拟方法或接口方法设置期望。如果您需要模拟这个类,您需要创建一个带有虚拟成员的包装器,并模拟它而不是真实的类。

请注意,如果您有一个resharper——这很简单,只需创建一个类,将hashalgalgorithm作为一个字段并选择Generate/Delegating Methods。然后选择需要模拟的方法并将它们设置为虚拟的:)

不幸的是,HashAlgorithm.ComputeHash方法不是虚拟的,不能被RhinoMocks模拟。

public byte[] ComputeHash(Stream inputStream) { ... }
public byte[] ComputeHash(byte[] buffer) { ... }
public byte[] ComputeHash(byte[] buffer, int offset, int count)
相关文章: