Подтвердить что ты не робот

Передача мок-объектов Moq в конструктор

Я использую 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?

4b9b3361

Ответ 1

Вам нужно пройти через экземпляр объекта макета

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

Вы также можете использовать объект mock для доступа к методам экземпляра.

mock.Object.GetFoo();

Мок документы

Ответ 2

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

Ответ 3

Предыдущие ответы верны, но для полноты картины я хотел бы добавить еще один способ. Использование функции 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