Проблема с настройкой соответствия в Moq
Я использовал Moq на прошлой неделе или около того и не было никаких проблем до сегодняшнего дня. У меня проблема с получением VerifyAll()
чтобы правильно соответствовать настройке моего макета.
В настоящее время я пишу модульные тесты для API моего приложения. Вот как структурировано приложение:
API <==> Service <==> DAO <==> Database
Имея это в виду, я высмеиваю объект службы, а затем создаю объект API с помощью смоделированной службы. Я написал ряд тестов уже без проблем до сих пор.
У меня есть две переменные экземпляра, как это:
private Api _api;
private Mock<IHibernateService> mockService;
Я инициализирую их в методе настройки:
[SetUp]
public void DoSetupTasks()
{
mockService = new Mock<IHibernateService>();
_api = new Api(mockService.Object);
}
Вот модульный тест, который не проходит:
[Test]
public void TestSearchOnAllProperties()
{
mockService
.Setup(service => service.LoadAll(It.IsAny<Type>()))
.Returns(new DomainBase[0]);
var dmbs = _api.SearchOnAllProperties("search term", typeof(DomainBase));
mockService.VerifyAll();
}
API SearchOnAllProperties()
впоследствии метод сделает звонок в сервис LoadAll()
метод (с некоторой дополнительной логикой, конечно), поэтому я хочу убедиться, что он вызывается правильно. Чтобы уточнить, вот как LoadAll()
вызывается в SearchOnAllProperties()
:
public IEnumerable<DomainBase> SearchOnAllProperties(string searchTerm, Type type)
{
foreach (DomainBase dmb in _hibernateService.LoadAll(type))
{
// additional logic
}
}
Тем не менее, когда я запускаю модульный тест, я получаю MockVerificationException
заявив, что данная настройка не была сопоставлена. Я не могу понять, почему, как это должно быть, звонит в службу LoadAll()
метод.
1 ответ
Одной из возможных причин является то, что в какой-то момент перед вызовом этого конкретного метода тестирования, mockService
присваивается новый экземпляр Mock<IHibernateService>
, Если это так, то этот метод теста будет вызывать Setup
на неправильном экземпляре, который затем произвел бы это исключение.
Быстрый способ проверить это будет использовать местный mockService
а также api
Переменные и посмотреть, если тест все еще не проходит:
[Test]
public void TestSearchOnAllProperties()
{
var localMockService = new Mock<IHibernateService>();
var localApi = new Api(localMockService.Object);
localMockService
.Setup(service => service.LoadAll(It.IsAny<Type>()))
.Returns(new DomainBase[0]);
var dmbs = localApi.SearchOnAllProperties("search term", typeof(DomainBase));
localMockService.VerifyAll();
}
НТН