Ответ 1
Вам нужно пройти через экземпляр объекта макета
var mock = new Mock<IBar>();
var foo = new Foo(mock.Object);
Вы также можете использовать объект mock для доступа к методам экземпляра.
mock.Object.GetFoo();
Я использую RhinoMocks на некоторое время, но только начал смотреть в Moq. У меня есть эта самая основная проблема, и меня удивляет, что это не вылетает прямо из коробки. Предположим, у меня есть следующее определение класса:
public class Foo
{
private IBar _bar;
public Foo(IBar bar)
{
_bar = bar;
}
..
}
Теперь у меня есть тест, где мне нужно Mock IBar, который отправляется в Foo. В RhinoMocks я просто делал бы это, как показано ниже, и он будет работать просто отлично:
var mock = MockRepository.GenerateMock<IBar>();
var foo = new Foo(mock);
Однако в Moq это, похоже, не работает одинаково. Я делаю следующее:
var mock = new Mock<IBar>();
var foo = new Foo(mock);
Однако теперь это терпит неудачу - говорит мне: "Невозможно преобразовать из" Moq.Mock "в" IBar ". Что я делаю неправильно? Каков рекомендуемый способ сделать это с помощью Moq?
Вам нужно пройти через экземпляр объекта макета
var mock = new Mock<IBar>();
var foo = new Foo(mock.Object);
Вы также можете использовать объект mock для доступа к методам экземпляра.
mock.Object.GetFoo();
var mock = new Mock<IBar>().Object
Предыдущие ответы верны, но для полноты картины я хотел бы добавить еще один способ. Использование функции Linq
библиотеки 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);
}
Вы можете использовать Mock.Of<T>
и избежать вызова .Object
.
FooClass sut = new FooClass(Mock.Of<IBar>(m => m.Bar("Bar") == 2 && m.AnotherBar() == 3));
int r = sut.Foo("Bar"); //r should be 2
или используя спички
FooClass sut = new FooClass(Mock.Of<IBar>(m => m.Bar(It.IsAny<string>()) == 2));
int r = sut.Foo("Bar"); // r should be 2