Передача moq-объектов Moq конструктору - PullRequest
54 голосов
/ 10 августа 2011

Я уже давно использую RhinoMocks, но только начал изучать Moq.У меня есть эта очень основная проблема, и меня удивляет, что это не вылетает прямо из коробки.Предположим, у меня есть следующее определение класса:

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

Теперь у меня есть тест, в котором мне нужно смоделировать 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?

Ответы [ 3 ]

98 голосов
/ 10 августа 2011

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

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

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

mock.Object.GetFoo();

moq docs

23 голосов
/ 10 августа 2011
var mock = new Mock<IBar>().Object
1 голос
/ 28 марта 2019

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

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

Вы можете использовать Mock.Of<T> и избегать .Object вызова.

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

или с использованием совпадений

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