дополнительное тестирование свойства на результатах автомпера с использованием moq - PullRequest
0 голосов
/ 09 января 2019

У меня есть метод ниже, который генерирует PDF, и модульный тест проходит через moq.

public Task<Document> GenerateDocumentAsync(IData data)
{
    var template = GetTemplateForTheme(data.Theme);
    VerifyTemplateExists(template);

    var relevantData = (RelevantData)data;
    var voucherViewModel = _mapper.Map<VoucherViewModel>(relevantData);
    var html = _htmlGenerator.Generate(template, voucherViewModel);
    var bytes = _pdfRenderer.Render(html);

    var document = new Document
    {
        Name = "Voucher.pdf",
        MimeType = "application/pdf",
        Data = bytes
    };

    return Task.FromResult(document);
}

и модульный тест проходит через moq.

        [TestInitialize]
        public void Initialize()
        {
            _mockPdfRenderer = new Mock<IPdfRenderer>();
            _mockPdfRenderer.Setup(x => x.Render(It.IsAny<string>())).Returns(AnyBytes());            

            _mockTemplateLocationResolver = new Mock<ITemplateLocationResolver>();
            _mockTemplateLocationResolver.Setup(x => x.Resolve(It.IsAny<string>(), It.IsAny<string>()))
                .Returns("template-name.cshtml");

            _mockHtmlGenerator = new Mock<IHtmlGenerator>();
            _mockMapper = new Mock<IMapper>();

            _mockFileSystemWrapper = new Mock<IFileSystemWrapper>();
            _mockFileSystemWrapper.Setup(x => x.Exists(It.IsAny<string>())).Returns(true);

            _mockChannelContext = new Mock<IChannelContext>();
            _mockChannelContext.SetupGet(x => x.ChannelId).Returns(default(int));
        }

        [TestMethod]
        public async Task GenerateDocumentAsync_Called_ExpectReturnsDocumentOfCorrectMimeType()
        {
            var target = DefaultSubjectUnderTest();
            var data = AnyRelevantData();
            var actual = await target.GenerateDocumentAsync(data);

            actual.MimeType.Should().Be("application/pdf");
        }       


        private VoucherGenerator DefaultSubjectUnderTest()
        {
            return new VoucherGenerator(
                _mockPdfRenderer.Object,
                _mockTemplateLocationResolver.Object,
                _mockHtmlGenerator.Object,
                _mockMapper.Object,
                _mockFileSystemWrapper.Object,
                _mockChannelContext.Object);
        }

        private static VoucherData AnyRelevantData()
        {
            return new VoucherData();
        }
        public interface IChannelContext
       {
           int ChannelId { get; }

           string ChannelName { get; }
        }

Когда я внес изменения в метод с дополнительным свойством, описанный выше тест не пройден, потому что _mapper.Map возвращает ноль и не может присвоить значение IsTradeExist, выбрасывая объект ошибки, не установленный для экземпляра. Как выполнить вышеупомянутый тестовый тест со следующими изменениями в коде? Как написать модульный тест исключительно для новой строки кода?

public Task<Document> GenerateDocumentAsync(IData data)
{
    var template = GetTemplateForTheme(data.Theme);
    VerifyTemplateExists(template);

    var relevantData = (RelevantData)data;
    var voucherViewModel = _mapper.Map<VoucherViewModel>(relevantData);
    voucherViewModel.IsTradeExist = _channelContext.ChannelId == (int)ChannelEnum.TradeSite; //new line of code added
    var html = _htmlGenerator.Generate(template, voucherViewModel);
    var bytes = _pdfRenderer.Render(html);

    var document = new Document
    {
        Name = "Voucher.pdf",
        MimeType = "application/pdf",
        Data = bytes
    };

    return Task.FromResult(document);
}   
...