MOQ - как смоделировать интерфейс, который нужно привести к другому интерфейсу?
То, что я хочу сделать, это построить moq для I1 - это нормально... однако в ходе тестируемого мной метода, использующего этот mock, мне нужно привести его к I2, чтобы получить доступ к некоторым свойствам, которые не включены I1
Interface I1
{ int AProperty{get;set;}}
Interface I2
{int AnotherProperty{get;set;}}
Тогда у меня есть несколько предметов
Class O1 : I1 {}
а также
Class O2 : O1 , I2 {}
проблема в том, что когда у меня есть экземпляр объекта реализации I2, я могу привести его к I1, чтобы получить доступ к методам, которые реализуются через этот интерфейс. В коде это не проблема, и все работает правильно, как ожидалось.
Единственная проблема возникает при написании модульного теста для этого класса.
Интерфейсы также предоставляют метод GetNewInstance, который возвращает инициализированный экземпляр реализующего объекта, приведенного к интерфейсу IGetNewInstance... Обычно я могу сделать это нормально и заставить его вернуться сам (и поэтому я продолжаю работать с объектом mock).
однако, когда вы пытаетесь преобразовать этот возвращенный объект типа I2 в I1, получается нулевая ссылка - это имеет смысл, поскольку фиктивный объект, который реализует I2, не наследует ничего от того, что наследует I1.
Вопрос в том, как заставить принудительный объект наследовать от обоих I1 и 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
Метод, вы можете просто установить ожидание, которое возвращает сам макет.