Я получаю Значение Logger не может быть нулевым. Я пытаюсь решить это, может быть, что-то с внедрением зависимости. Ошибка получена при юнит-тесте и везде в программе. Правильно ли я выполняю внедрение зависимостей?
Expected: <System.ArgumentException>
But was: <System.ArgumentNullException: Value cannot be null.
Parameter name: logger
at Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger logger,
LogLevel logLevel, EventId eventId, Exception exception,
String message, Object[] args)
Мой код выглядит следующим образом:
using System;
using ElectronicsStore.Models;
using Microsoft.Extensions.Logging;
namespace ElectronicsStore.Service
{
public class ParseVendorSupply
{
private readonly ILogger _logger;
public ParseVendorSupply(ILogger logger)
{
_logger = logger;
}
public VendorSupply FromCsv(string csvLine)
{
VendorSupply vendorsupply = new VendorSupply();
try
{
string[] values = csvLine.Split(',');
if (values.Length > 3)
{
throw new System.ArgumentException("Too much data");
}
vendorsupply.VendorId = Convert.ToInt16(values[0]);
vendorsupply.ProductId = Convert.ToInt16(values[1]);
vendorsupply.Quantity = Convert.ToInt16(values[2]);
}
catch (Exception)
{
_logger.LogInformation("An exception was thrown attempting");
}
return vendorsupply;
}
}
}
public Startup(IConfiguration configuration, ILogger<Startup> logger)
{
Configuration = configuration;
_logger = logger;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(new LoggerFactory().AddConsole().AddDebug());
services.AddLogging();
Тест NUnit:
public class ParseVendorSupplyNunit
{
ILogger logger;
//conducting this gives me an error, since cannot create instance of abstract class, not sure what alternative is
//ILogger logger = new ILogger();
[Test]
public void FromCsv_ParseCorrectly_Extradata()
{
string csvLineTest = "5,8,3,9,5";
ParseVendorSupply parseVendorSupplytest = new ParseVendorSupply(logger);
//VendorSupply vendorsupply = parseVendorSupplytest.FromCsv(csvLineTest);
Assert.That(() => parseVendorSupplytest.FromCsv(csvLineTest), Throws.ArgumentException);
}
Вы должны инициализировать переменную logger
с помощью реализации ILogger
такой как ConsoleLogger
или чего-то подобного. Я бы порекомендовал подделать регистратор, потому что вы находитесь в UnitTest и, вероятно, не хотите делать тестирование самостоятельно. Так что используйте FakeItEasy или какой-нибудь другой Mocking-Libary и создайте поддельный экземпляр поверх A.Fake<ILogger>()
logger
нигде в классе модульного тестирования.logger
где-нибудь в классе модульного теста