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?
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();
var mock = new Mock<IBar>().Object
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