У меня есть метод ниже, который генерирует 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);
}