MOQ - как насмехаться над интерфейсом, который нужно перевести на другой интерфейс?
то, что я хочу сделать, это построить moq для I1 - это прекрасно... однако в ходе метода, который я тестирую, который использует этот макет, мне нужно передать его в I2, чтобы получить доступ к некоторым свойствам, которые не на I1
Interface I1
{ int AProperty{get;set;}}
Interface I2
{int AnotherProperty{get;set;}}
Затем у меня есть некоторые объекты
Class O1 : I1 {}
и
Class O2 : O1 , I2 {}
проблема заключается в том, что когда у меня есть экземпляр объекта реализации I2, я могу передать его в I1, чтобы получить доступ к методам, имплантированным через этот интерфейс. В коде это не проблема, и все работает так, как ожидалось.
Единственная проблема возникает при написании unit test в этом классе.
Интерфейсы также выставляют метод GetNewInstance, который возвращает инициализированный экземпляр объекта-объекта, внедряемого в интерфейс IGetNewInstance... Я обычно могу издеваться над этим способом и заставить его вернуться сам (и поэтому я продолжаю работать с макетным объектом).
однако, когда вы пытаетесь сделать этот возвращенный объект типа I2 в I1 нулевым ссылочным результатом - это имеет смысл, поскольку макет-объект, который реализует I2, не наследует ничего, что наследует I1.
Вопрос в том, как я могу заставить mock-объект наследовать от I1 ansd I2 одновременно?
Ответы
Ответ 1
Как я понимаю вас, вы хотите создать макет, который реализует два интерфейса. С Moq это так просто:
var mock = new Mock<IFoo>(); // Creates a mock from IFoo
mock.As<IBar>(); // Adds IBar to the mock
mock.As<IBar>().Setup(m => m.BarMethod()).Returns(new object()); // For setups.
Теперь вы можете настроить ожидания и использовать свой макет, поскольку обычно вы используете объект, реализующий как IFoo
, так и IBar
.
Для вашего метода GetNewInstance
вы можете просто настроить ожидание, которое возвращает сам макет.