Как установить переменную в команде, используя Mediatr с Moq? - PullRequest
0 голосов
/ 04 января 2019

У меня есть простой тест функционального стиля для вывода команды, которую я написал, используя 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); Надеюсь, что кому-то поможет!

...