Я новичок в Moq, и я просто смотрел видеоролик с множественным количеством изображений на Moqing, поэтому я чувствовал себя уверенным, чтобы пойти и написать несколько тестов. Я имею базовый класс, скажем, лист, который реализует интерфейс ISheet. Лист является базовым классом для страниц:Moq базовая функция класса из производного класса
abstract class Sheet: ISheet
{
public virtual void CreateSheet() // Defined in ISheet
{
}
public virtual void BuildSheet() // Defined in ISheet
{
}
//and some abstract methods, etc.
}
public class Page : Sheet
{
public override void CreateSheet()
{
BuildSheet(); // Base class implementation
}
}
Я перекрыла один из методов из базового класса, который CreateSheet()
, но я хочу, чтобы проверить, что метод BuildSheet()
в базовом классе вызывается из моего производного класса:
Таким образом, в моем тестовом классе, я MOq в SUT вместо интерфейса
var MockSheet = new Moq<Page>();
вызова метода:
var actual = MockSheet.Object.CreateSheet();
Затем проверьте
MockSheet.Verify(x => x.BuildSheet(), Times.AtLeastOnce);
Вместо этого я получаю MockException «Ожидаемую Инвокацию на макете, по крайней мере один раз, но никогда не был выполнен. Метод CreateSheet никогда не вызывается. Если изменить его CreateSheet метод:
public void CreateDocSheet() // removed override
{
BuildSheet() // base classses implementation
}
И в тестовый звонок:
var actual = MockSheet.Object.CreateDocSheet();
Он работает. Я не понимаю, почему. Я считаю, что функционально, что это допустимый способ кодирования, у меня есть лист, который имеет 2 страницы, у меня есть интерфейс, который определяет все функции и свойства, которые должны быть реализованы, я реализую эти функции в базовом классе, но не все методы должны выполняться в производных классах, поэтому некоторые методы переопределяются, а некоторые используют реализацию базового класса. Пожалуйста, объясните, почему проблема заключается в использовании переопределенной версии функции?
Хотя все это хорошая и полезная информация, Moq не может проверить, что 'PageCreateSheet' вызывает реализацию' BuildSheet' Sheet, а не '' '' BuildSheet'. Moq способен записывать вызовы на свой собственный прокси-сервер для самого издевающегося объекта. –
Спасибо, что сработало и спасибо за объяснение. Я думал, что должен быть способ протестировать реализацию базового класса из производного класса без необходимости писать новую функцию, которую я еще не планировал делать. – user3666407