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 58

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 метод, вы можете просто настроить ожидание, которое возвращает сам макет.