2016-05-05 42 views
8

我目前混淆如何模拟。Mock.Of <Object> VS模拟<Object>()

我正在使用Moq。嘲笑对象我通常这样写

var mockIRepo = new Mock<IRepo>(); 

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

选项1 是不是更好地嘲笑我的对象只包含属性这种方式?

var object = Mock.Of<Object>() 

1选项 还是这样

var object = new Mock<Object>() 

我读过选项2具有setupproperties这是有点怀疑我,因为我也可以在选项中设置的属性1.

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

+1

这里的答案 - HTTPS ://cmatskas.com/improve-your-unit-tests-with-mock-of/ – niksofteng

回答

-2

这就是为什么我不喜欢所有变量的var关键字。选项2返回一个模拟<T>而选项1返回T.基本上它只是语法差异。你可以用不同的方式嘲笑方法。请参阅文档。

+0

对负面反馈有何评论? –

7

这篇文章帮助我了解Mock.Of <牛逼>: Old style imperative Mock<T> vs functional Mock.Of<T>

如在后解释的,Mock.Of <牛逼>你说“给我一个行为像这样的模拟” (或模拟s。如果您需要获取许多对象(IEnumerable)),请致电<T>)。它使得模拟的声明更加简洁。

实施例用模拟<Ť>(返回一个模拟)使用Mock.Of <Ť>

var el1 = new Mock<IElementInfo>(); 
el1.Setup(x => x.Id).Returns(Guid.NewGuid()); 
el1.Setup(x => x.Multiplicity).Returns(Multiplicity.Single); 

var c1 = new Mock<ICollectionInfo>(); 
c1.Setup(x => x.Id).Returns(Guid.NewGuid()); 
c1.Setup(x => x.Multiplicity).Returns(Multiplicity.Multiple); 

var p1 = new Mock<IPropertyInfo>(); 
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<IPropertyInfo>(); 
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<IElementInfo>(); 
elementInfoMock.Setup(e => e.Id).Returns(Guid.NewGuid()); 
elementInfoMock.Setup(e => e.Multiplicity).Returns(Multiplicity.Multiple); 
elementInfoMock.Setup(e => e.Elements) 
    .Returns(new List<IAbstractElementInfo> 
    { 
     el1.Object, 
     c1.Object, 
    }); 
elementInfoMock.Setup(x => x.Properties).Returns(
    new List<IPropertyInfo> 
    { 
     p1.Object, 
     p2.Object, 
    }); 

this.elementInfo = elementInfoMock.Object; 

相同例子(返回类的一个实例)

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