如何使用 Mock.Of<T>() 模拟没有默认构造函数的类?

Cri*_*scu 5 c# unit-testing moq

使用 Moq,我需要在没有默认 ctor的现有(不是接口*)上创建一个假的。

我可以使用“传统”语法来做到这一点:

var fakeResponsePacket = new Mock<DataResponse>(
    new object[]{0, 0, 0, new byte[0]}); //specify ctor arguments

fakeResponsePacket.Setup(p => p.DataLength).Returns(5);

var checkResult = sut.Check(fakeResponsePacket.Object);
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有办法使用较新的Mock.Of<T>()语法来做同样的事情?

据我所见,只有两个重载Mock.Of<T>,其中都不接受参数:

//1 no params at all
var fakeResponsePacket = Mock.Of<DataResponse>(/*??*/);
fakeResponsePacket.DataLength = 5;

//2 the touted 'linq to Moq'
var fakeResponsePacket = Mock.Of<DataResponse>(/*??*/
    p => p.DataLength == 5
);

var checkResult = sut.Check(fakeResponsePacket);
Run Code Online (Sandbox Code Playgroud)

--
* 我使用一个界面。但后来现实发生了。我们先不深究。

Jep*_*sen 4

不,似乎没有办法做到这一点。

旁注:在“旧”语法中,您可以编写:

new Mock<DataResponse>(0, 0, 0, new byte[0]) //specify ctor arguments
Run Code Online (Sandbox Code Playgroud)

因为存在数组参数params参数数组)。

要解决0转换为 a 的问题MockBehavior(请参阅上面的注释和划掉的文本),您可以执行以下操作:

new Mock<DataResponse>(MockBehavior.Loose, 0, 0, 0, new byte[0]) //specify ctor arguments
Run Code Online (Sandbox Code Playgroud)

或者做:

var v = 0; // this v cannot be const!
// ...
new Mock<DataResponse>(v, 0, 0, new byte[0]) //specify ctor arguments
Run Code Online (Sandbox Code Playgroud)

但这当然不是您所要求的真正内容的一部分。