Mock.Of VS Mock ()

我目前对如何模仿感到困惑。

我正在使用Moq。 为了模拟对象,我通常以这种方式编写

var mockIRepo = new Mock(); 

但是,我需要为我的设置创建模拟对象。

Option1以这种方式模拟仅包含属性的对象是否更好?

  var object = Mock.Of() 

Option2或者这样

  var object = new Mock() 

我已经读过选项2有setupproperties这对我来说有点问题,因为我也可以在选项1中设置属性。

那有什么区别? 或者,还有更好的方法?

这篇文章帮助我了解Mock.Of : 旧式命令Mock vsfunction性Mock.Of

正如post中所解释的那样,使用Mock.Of 你会说“给我一个行为像这样的模拟”(或者如果你需要获得许多对象(IEnumerable),则为Mock s .Of )。 它使模拟的声明更简洁。

Mock 示例(返回模拟)

 var el1 = new Mock(); el1.Setup(x => x.Id).Returns(Guid.NewGuid()); el1.Setup(x => x.Multiplicity).Returns(Multiplicity.Single); var c1 = new Mock(); c1.Setup(x => x.Id).Returns(Guid.NewGuid()); c1.Setup(x => x.Multiplicity).Returns(Multiplicity.Multiple); var p1 = new Mock(); p1.Setup(x => x.Id).Returns(Guid.NewGuid()); p1.Setup(x => x.Name).Returns("Foo" + Guid.NewGuid().ToString()); p1.Setup(x => x.Type).Returns("System.String"); var p2 = new Mock(); p2.Setup(x => x.Id).Returns(Guid.NewGuid()); p2.Setup(x => x.Name).Returns("Bar" + Guid.NewGuid().ToString()); p2.Setup(x => x.Type).Returns("System.String"); var elementInfoMock = new Mock(); elementInfoMock.Setup(e => e.Id).Returns(Guid.NewGuid()); elementInfoMock.Setup(e => e.Multiplicity).Returns(Multiplicity.Multiple); elementInfoMock.Setup(e => e.Elements) .Returns(new List { el1.Object, c1.Object, }); elementInfoMock.Setup(x => x.Properties).Returns( new List { p1.Object, p2.Object, }); this.elementInfo = elementInfoMock.Object; 

使用Mock.Of 的相同示例(返回类的实例)

 this.elementInfo = Mock.Of(x => x.Id == Guid.NewGuid() && x.Multiplicity == Multiplicity.Multiple && x.Elements == new List { Mock.Of(e => e.Id == Guid.NewGuid() && e.Multiplicity == Multiplicity.Single), Mock.Of(e => e.Id == Guid.NewGuid() && e.Multiplicity == Multiplicity.Single), } && x.Properties == new List { Mock.Of(p => p.Id == Guid.NewGuid() && p.Name == "Foo" + Guid.NewGuid() && p.Type == "System.String"), Mock.Of(p => p.Id == Guid.NewGuid() && p.Name == "Foo" + Guid.NewGuid() && p.Type == "System.String"), }); 

这就是为什么我不喜欢所有变量的var关键字。 选项2返回Mock ,而选项1返回T.基本上它只是语法差异。 您可以以不同的方式模拟方法。 见文档。