System.ArgumentNullException:单元测试中的值不能为 null - C#

Nik*_*nak 5 c# nunit unit-testing serilog asp.net-core

当我运行单元测试时,我收到此错误:\nError Message:\n System.ArgumentNullException : Value cannot be null.\nParameter name: logger并且我收到此警告:\nField \'OrderControllerTest._logger\' is never assigned to, and will always have its default value null

\n\n

有没有办法让记录器静音或测试它?

\n\n

对编程还是新手,渴望学习。已经为此奋斗了很长时间。感谢您的帮助和指导。

\n\n

使用堆栈跟踪更新

\n\n
Stack Trace:\n   at Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger logger, LogLevel logLevel, EventId eventId, Exception exception, String message, Object[] args)\n   at Microsoft.Extensions.Logging.LoggerExtensions.LogError(ILogger logger, Exception exception, String message, Object[] args)\n   at Project.Controllers.OrderController.CustomerOrders(String customerId) in C:\\projects\\Project\\Controllers\\OrderController.cs:line 34\n   at Tests.OrderControllerTest.AllOrdersForCustomer() in C:\\projects\\UnitTests\\Project.Service.Tests\\OrderControllerTest.cs:line 74\n
Run Code Online (Sandbox Code Playgroud)\n\n

到目前为止我所拥有的:

\n\n

OrderControllerTest.cs:

\n\n
using System;\nusing System.Collections.Generic;\nusing NUnit.Framework;\nusing Project.Models;\nusing Project.Controllers;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Logging;\n\nnamespace Tests\n{\n  [TestFixture]\n  public class OrderControllerTest\n  {\n      ILogger<OrderController> _logger;\n\n      public OrderControllerTest()\n      {\n\n      }\n\n      [Test]\n      public void AllOrdersForCustomer()\n      {\n        // Arrange\n        var controller  = new OrderController(_logger);\n        var expectedResult = new List<Order>();\n        var oneOrder = new Order()\n        {\n            orderId = 228, \n            product= "Jeans",\n            status = "Ready for shipping",\n            price= 20$\n        };\n\n        var twoOrder = new Order()\n        {\n            caseId = 512, \n            creditorName = "Basketball",\n            status = "Shipped",\n            totalOpenBalance = 30$\n        };\n        expectedResult.Add(oneOrder);\n        expectedResult.Add(twoOrder);\n\n        // Act\n        var actionResult = controller.CustomerOrders("1243");\n        var result = (List<Order>)actionResult;\n\n        // Assert\n        for (var i = 0; i < result.Count; i++)\n        {               \n          CollectionAssert.AreEqual(expectedResult, result);\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

订单控制器.cs:

\n\n
using System;\nusing System.Collections.Generic;\nusing Project.Models;\nusing Project.Repositories;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Logging;\n\n\nnamespace Project.Controllers\n{\n  public class OrderController : Controller\n  {\n    ILogger<OrderController> _logger;\n\n    public OrderController(ILogger<OrderController> logger)\n    {\n        _logger = logger;\n    }\n\n    [HttpGet("customers/{customerId}/orders")]\n    public List<Order> CustomerOrders(string customerId)\n    {\n        try\n        {\n            return OrderRepository.AllOrders(customerId);\n        }\n        catch (Exception ex)\n        {\n            _logger.LogError(ex, "Cant retrieve no orders.");\n            return null;\n        }\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n
 ILogger<OrderController> _logger;\n\n public OrderControllerTest()\n {\n    _logger = new Mock<ILogger<OrderController>>().Object;  \n }\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

订单存储库.cs:

\n\n
    public static List<Order> AllOrders(string customerId)\n    {\n        var orderlist = new List<Order>();\n\n\n    \xc2\xa0   if (Order!=null && Order.Count>0)\n        {\n            if (Order.TryGetValue(customerId, out orderlist))\n                return orderlist;\n        }\n        return FromDB(customerId);\n\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

Phi*_*ing 4

假设您已从 EL MOJO 获取输入,您需要在测试中使用 Moq 初始化 ILogger:

Mock<ILogger<OrderController>> _logger;

public OrderControllerTest()
{
    _logger = new Mock<ILogger<OrderController>>();
    _logger.Setup(m => m.LogError(It.IsAny<Exception>(), It.IsAny<string>()));
}
Run Code Online (Sandbox Code Playgroud)

现在您应该使用以下内容初始化控制器:

var controller  = new OrderController(_logger.Object);
Run Code Online (Sandbox Code Playgroud)