Как смоделировать класс, реализующий несколько интерфейсов, и привести ложный объект обратно к типу класса? - PullRequest
0 голосов
/ 09 января 2020

Класс Calculator реализует несколько интерфейсов.

public class Calculator : IAdd, ISubtract, IMultiply, IDivide
{
    ...
}

Как бы я смоделировал этот класс, используя Moq, и передал в MyMethod?

public int MyMethod(Calculator calculator)
{
    ...
}

Например, я издевался над IMultiply и пытался привести его к Калькулятору, но это стал нулевым.

1 Ответ

3 голосов
/ 09 января 2020

Чтобы непосредственно ответить на первоначальный вопрос, класс Calculator можно смоделировать как

Mock<Calculator> mock = new Mock<Calculator>();

Moq позволяет извлекать определенные c производные типы для установки с использованием As<T>()

Mock<IMultiply> multiplyMock = mock.As<IMultiply>();
multiplyMock.Setup(...);

var subject = new MyClass();

subject.MyMethod(mock.Object);

В плане дизайна я бы предложил Calculator начать с собственного интерфейса.

Создать единый интерфейс для объединения функций

public interface ICalculator: IAdd, ISubtract, IMultiply, IDivide {

}

и иметь Calculator вывод из этого

public class Calculator : ICalculator {
    //...
}

Метод зависит от абстракции

public int MyMethod(ICalculator calculator) {
    //...
}

И при тестировании интерфейс может быть легко смоделирован при необходимости.

//Arrange
var calculator = Mock.Of<ICalculator>(); //and configure expected behavior

var subject = new MyClass();

//Act
var result = subject.MyMethod(calculator);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...