2016-05-05 149 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"), 
});