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, чтобы получить доступ к методам, которые имплицируются через это взаимодействие. В коде это не проблема и everythign работает так, как ожидалось.
единственная проблема возникает при написании модульного теста на этом классе.
интерфейсы также предоставляют метод GetNewInstance, который возвращает инициализированный экземпляр объекта реализации, приведенного в интерфейс IGetNewInstance ... обычно я могу издеваться над этим штрафом и заставить его вернуться (и поэтому я продолжаю работать с макетом объекта).
однако, когда вы пытаетесь разыграть эту возвращаемый объект типа I2 в I1 приводит к нулевой ссылке - это имеет смысл, поскольку макет объекта, реализующий I2, не наследуется ни от чего, что наследует I1.
вопрос в том, как я могу заставить макет объекта наследовать от обоих 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
метод, вы можете просто настроить ожидание, которое возвращает сам макет.