web-dev-qa-db-fra.com

Passer des objets fantaisie Moq au constructeur

J'utilise RhinoMocks depuis un bon moment, mais je viens de commencer à étudier Moq. J'ai ce problème très basique, et cela me surprend que cela ne vole pas tout de suite. Supposons que j'ai la définition de classe suivante:

public class Foo
{
    private IBar _bar; 
    public Foo(IBar bar)
    {
        _bar = bar; 
    }
    ..
}

Maintenant, j'ai un test où je dois me moquer de l'IBar qui envoie à Foo. Dans RhinoMocks, je le ferais simplement comme suit, et cela fonctionnerait très bien:

var mock = MockRepository.GenerateMock<IBar>(); 
var foo = new Foo(mock); 

Cependant, dans Moq, cela ne semble pas fonctionner de la même manière. Je fais comme suit:

var mock = new Mock<IBar>(); 
var foo = new Foo(mock); 

Cependant, maintenant il échoue - me disant "Impossible de convertir de 'Moq.Mock' en 'IBar'. Que fais-je de mal? Quelle est la méthode recommandée pour le faire avec Moq?

58
stiank81

Vous devez passer par l'instance d'objet de la maquette

var mock = new Mock<IBar>();  
var foo = new Foo(mock.Object);

Vous pouvez également utiliser l'objet mock pour accéder aux méthodes de l'instance.

mock.Object.GetFoo();

documents moq

99
skyfoot
var mock = new Mock<IBar>().Object
23
Massimiliano Peluso

Les réponses précédentes sont correctes, mais par souci d'exhaustivité, je voudrais ajouter une autre façon. Utilisation de la fonction Linq de la bibliothèque moq.

public interface IBar
{
    int Bar(string s);

    int AnotherBar(int a);
}

public interface IFoo
{
    int Foo(string s);
}

public class FooClass : IFoo
{
    private readonly IBar _bar;

    public FooClass(IBar bar)
    {
        _bar = bar;
    }

    public int Foo(string s) 
        => _bar.Bar(s);

    public int AnotherFoo(int a) 
        => _bar.AnotherBar(a);
}

Vous pouvez utiliser Mock.Of<T> et évitez .Object appel.

FooClass sut = new FooClass(Mock.Of<IBar>(m => m.Bar("Bar") == 2 && m.AnotherBar(1) == 3));
int r = sut.Foo("Bar"); //r should be 2
int r = sut.AnotherFoo(1); //r should be 3

ou en utilisant des matchers

FooClass sut = new FooClass(Mock.Of<IBar>(m => m.Bar(It.IsAny<string>()) == 2));
int r = sut.Foo("Bar"); // r should be 2
1
Johnny