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

时间:2015-08-12 09:01:09

标签: c# unit-testing moq

使用Moq,我需要在现有的(不是接口*)上创建一个虚假的 no default ctor

我可以使用&#34;传统&#34;语法:

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

我的问题是:有没有办法使用较新的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);

-
*我想要使用界面。但后来现实发生了。我们不要进入它。

1 个答案:

答案 0 :(得分:2)

不,似乎无法做到这一点。

旁注:在“旧”语法中,您只需写:

new Mock<DataResponse>(0, 0, 0, new byte[0]) //specify ctor arguments

,因为数组参数有paramsparameter array)。

要解决0转换为MockBehavior的问题(请参阅上面的评论和划掉的文字),您可以这样做:

new Mock<DataResponse>(MockBehavior.Loose, 0, 0, 0, new byte[0]) //specify ctor arguments

或做:

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

但当然,这并不是你要求的一部分。