web-dev-qa-db-fra.com

Mock.Of <Object> VS Mock <Object> ()

Je suis actuellement confus sur la façon de se moquer.

J'utilise Moq. Pour se moquer des objets, j'écris généralement de cette façon

 var mockIRepo = new Mock<IRepo>();

Cependant, je dois créer un faux objet pour ma configuration.

Option1 Est-il préférable de se moquer de mon objet qui ne contient que des propriétés de cette façon?

 var object = Mock.Of<Object>()

Option2 Ou de cette façon

 var object = new Mock<Object>()

J'ai lu que l'option 2 a setupproperties qui est un peu discutable pour moi car je pourrais également définir les propriétés de l'option 1.

Alors quelle est la différence? Ou existe-t-il une meilleure façon?

31
user1960948

Ce message m'a aidé à comprendre Mock.Of <T>: Ancien style impératif Mock <T> vs Mock.Of <T> fonctionnel

Comme expliqué dans la publication, avec Mock.Of <T> vous dites "Donnez-moi une maquette qui se comporte comme ça" (ou Mock s ). De <T> si vous avez besoin d'obtenir de nombreux objets (IEnumerable)). Cela rend la déclaration d'une maquette plus concise.

Exemple avec Mock <T> (retourne un Mock)

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;

Même exemple en utilisant Mock.Of <T> (retourne une instance de la classe)

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"),
});
29
Riga