У меня есть простой тест функционального стиля для вывода команды, которую я написал, используя IRequest
и IRequestHandler<>
Mediatr.
[Fact]
public void TestReturnValuesAsync()
{
// Arrange
var handler = new Mock<IRequestHandler<SyncSubmerchantDataCommand, CommandResult<int>>>();
handler.Setup(x => x.Handle(It.IsAny<SyncSubmerchantDataCommand>(), It.IsAny<CancellationToken>())).ReturnsAsync(new CommandResult<int>(0, ResultStatus.Success, "string"));
// Act
var result = handler.Object.Handle(new SyncSubmerchantDataCommand(), new CancellationToken());
// Assert
result.Result.Data.ShouldBe(0);
result.Result.Status.ShouldBe(ResultStatus.Success);
result.Result.Message.ShouldBe("string");
}
Поскольку эта команда выполняется как фоновая задача, я не хочу, чтобы она прерывалась. У меня есть переменная submerchantList
типа List<T>
, которая используется в цикле foreach
для выполнения работы. Работа выполняется в режиме try-catch, потому что я не хочу прерывать команду, как я уже говорил ранее. Я хочу проверить вывод того, что записано в мои журналы (_log.info), если во время этого процесса выдается исключение.
public class CommandNameHandler : IRequestHandler<source, destination> {
// constructors and privates
public async destination Handle(param, token)
{
var submerchantList = db call.ToList();
foreach (var item in submerchantList)
{
try {
//does work
}
catch (Exception e) {
if (item != null)
_log.info($"{e} - {item.Id}");
}
return some out put
}
Проблема в том, что я не могу понять, как установить значение любой переменной, такой как submerchantList
в Handle
, чтобы вызвать исключение для моего следующего теста. Я в тупике.
Любая помощь будет принята с благодарностью.
РЕШЕНИЕ:
Здесь было решение: заглушить вызов базы данных, вставив в память DbSet. Я пользовался этим ресурсом строковая версия, а не версия LINQ-chain в модульном тесте. Итак, это значит mockDbset.Setup(x => x.Table.Include("Foreign")).Returns(myCustomDbSet);
Надеюсь, что кому-то поможет!