Как протестировать методы asyn c с помощью Moq и xUnit - PullRequest
1 голос
/ 13 июля 2020

У меня есть следующий метод, который вызывает методы вставки и обновления.

Условия

  1. В приведенной ниже функции ProcessBspLoan я вызываю другую функцию с именем getBspData, если getBspData возвращает какой-либо результат. Я буду вставлять результат и обновлять базу данных как успех для конкретного идентификатора

  2. если getBspData вызывает какое-либо исключение, я буду только обновить базу данных как сбой для определенного Id без вставки

Вот функция ProcessBspLoan в данном классе

    public class BspLoanProcessor : IBspLoanProcessor
    {
        private readonly IBspClient _bspService;
        private readonly IBspRepository _bspRepository;
        private readonly ILogger<BspLoanProcessor> _logger;
        private readonly IMapper _mapper;
        private readonly IFhaRepository _fhaRepository;

        public BspLoanProcessor(IBspClient bspService, ILogger<BspLoanProcessor> logger, 
            IMapper mapper, IBspRepository bSPRepository, IFhaRepository fhaRepository)
        {
            _bspService = bspService;
            _logger = logger;
            _mapper = mapper;
            _bspRepository = bSPRepository;
            _fhaRepository = fhaRepository;
        }

        public async Task<bool> ProcessBspLoan(BspLoanDetails bspLoanDetails, string transactionId, string triggerType)
        {
            FhaTransactionDetails fhaData = _mapper.Map<FhaTransactionDetails>(bspLoanDetails);

            try
            {
                ////////////////////////////Calling getBspData///////////////////////////////////////
                var result = await _bspService.getBspData(bspLoanDetails.NsmLoanNumber, transactionId);

                result.TransactionId = transactionId;

                await _bspRepository.InsertBspResponse(result);
                
                await _fhaRepository.UpdateFhaTransactionWithLoanNumber(transactionId,"SUCCESS");
                return true;
            }
            catch(Exception ex)
            {
                await _fhaRepository.UpdateFhaTransactionWithLoanNumber(transactionId,"FAIL");
                return false;
            }
        }
    }

Я написал метод тестирования для вышеуказанной функции, чтобы проверить, возвращает ли она истину или ложь в зависимости от предоставленных входных данных

Вот моя тестовая функция

    public async Task Test1Async()
    {
        Mock<IBspLoanProcessor> _bspLoanProcessor = new Mock<IBspLoanProcessor>();
        Mock<IBspRepository> _bspRepository = new Mock<IBspRepository>();
        Mock<IFhaRepository> _fhaRepository = new Mock<IFhaRepository>();
        Mock<IBspClient> _bspClient = new Mock<IBspClient>();
        BspLoanDetails bspLoanDetails = new BspLoanDetails
        {
            TriggerType = "BLOB",
            Attempts = 1,
            FirstRunDateTime = DateTime.Now.ToUniversalTime()
        };
        ----> 1
        _bspClient.Setup(x => x.getBspData(It.IsAny<string>(), It.IsAny<string>())).Returns(Task.FromResult(new BspResponseDetails()));
        ----> 2
        _bspRepository.Setup(x => x.InsertBspResponse(It.IsAny<BspResponseDetails>())).Returns(Task.CompletedTask);
        ----> 3
        _fhaRepository.Setup(x => x.UpdateFhaTransactionWithLoanNumber(It.IsAny<string>(),It.IsAny<string>())).Returns(Task.CompletedTask);
        bool value = await _bspLoanProcessor.Object.ProcessBspLoan(bspLoanDetails, "123", "SCHEDULE");
        Assert.True(value);
    }

В приведенном выше примере test, я проверяю первое условие

  1. Я возвращаю данные как объект всякий раз, когда кто-либо получает данные
  2. Вставка BspResponsemethod также я возвращаю task.completedTask
  3. UpdateFhaTransactionWithLoanNumber также я возвращаю task.completedTask

Фактический ожидаемый результат верен, но он возвращает false.

Я новичок в Moq и xUnit. Пожалуйста, помогите мне решить эту проблему, а также протестируйте методы asyn c и await.

Интерфейс IBspClient

    public interface IBspClient
    {
        Task<BspResponseDetails> getBspData(string loanNumber,string tid);

        Task<BspHealthCheck> GetHealthStatus();
    }

Интерфейс IBspRepository

    public interface IBspRepository
    {
        Task InsertBspResponse(BspResponseDetails bsp);
    }

Интерфейс IFhaRepository

    public interface IFhaRepository
    {
        Task UpdateFhaTransactionWithLoanNumber(string tid, string status);    
    }

Заранее спасибо

1 Ответ

2 голосов
/ 13 июля 2020

bool value = await _bspLoanProcessor.Object

Вы вызываете метод своего макета. Вы не должны имитировать тестируемую систему, вы только имитируете ее зависимости.

Просто new класс, который вы хотите протестировать, иначе вы будете проверять, что ваш макет фреймворка делает то, что вы его настроили. to.

И поскольку вы не установили ProcessBspLoan(), он возвращает значение по умолчанию для своего возвращаемого значения, поэтому false.

...