У меня есть следующий сценарий, и я размышлял, как правильно протестировать мои услуги. У меня есть 2 сервиса и 2 репозитория.
public class ServiceB : IServiceB
{
public ServiceA(IRepoB)
{
}
public async Task AuditInsert(param, param)
{
IRepoB.Insert(param, param)
}
}
public class ServiceA : IServiceA
{
public ServiceA(IRepoA, IServiceB)
{
}
public async bool DoSomething(param)
{
//logic here
IRepoA.Merge(param)
IServiceB.AuditInsert(param, param)
}
}
////// Testing part
public class ServiceATests
{
private readonly ServiceA _sut;
private readonly Mock<IRepoA> _repoA = new(MockBehavior.Strict)
private readonly Mock<ServiceB> _serviceB = new(MockBehavior.Strict)
_repoA.Setup(x => x.Merge(It.IsAny<ParamEntity>)).Return(Task.TaskCompleted)
_serviceB.Setup(x => x.AuditInsert(It.IsAny<ParamEntity>, It.IsAny<ParamEntity>)).Return(Task.TaskCompleted)
_sut = new ServiceA(_repoA.Object, _serviceB.Object)
}
[Fact]
public async Task TestSomething()
{
//arrange
var testParam = {} // an object
//act
await _sut.DoSomething(testParam)
//assert
_repoA.Verify(x => x.Merge(), Times.Once)
_serviceB.Verify(x => x.AuditInsert(It.IsAny<ParamEntity>, It.IsAny<ParamEntity>), Times.Once)
}
Ошибка, которую я получаю при действии, заключается в том, что «вызов не выполнен со строгим макетом поведения, все вызовы макета должны иметь соответствующую настройку».
Код не работает в ServiceA в строке IServiceB.AuditInsert(param, param).
Вероятно, потому, что когда я настраиваю ServiceB, мне нужно каким-то образом передать макет RepoB? Но я не знаю, как это сделать. Или лучше я удалю часть _serviceB.Verify и просто создам новый класс для тестирования только serviceB?
Как следует реализовать эту цепочку зависимостей на этапе тестирования?
Я использую xunit с Mock
Я создал небольшой репозиторий git с проектом, в котором можно воспроизвести ошибку https://github.com/masterxfile/xUnitExample/tree/main/WebApplication1
@GuruStron Я создал репозиторий git с небольшим проектом, в котором можно воспроизвести ошибку github.com/masterxfile/xUnitExample/tree/main/WebApplication1
В вашем воспроизведении тест отмечен зеленым цветом (как и в моей попытке воспроизвести на основе предоставленного кода).
@GuruStron, можешь попробовать сделать это сейчас, я забыл отправить последний коммит, чтобы воспроизвести проблему.





Предоставленное воспроизведение приводит к следующей ошибке:
Вызов IAuditService.InsertAudit("test", "Да") завершился неудачно с имитацией поведения Strict. Вызов должен возвращать значение и, следовательно, должен иметь соответствующую настройку, которая его предоставляет.
Добавление .Returns(Task.CompletedTask) в соответствующий макет решает проблему:
auditService.Setup(x => x.InsertAudit("test", "Yes"))
.Returns(Task.CompletedTask);
Большое спасибо за ваш ответ, терпение и время. Это помогло мне понять, что я делаю неправильно
Пожалуйста, предоставьте минимально воспроизводимый пример. Он должен как минимум скомпилировать и воспроизвести вашу проблему.