【问题标题】:Object not set to reference while unit testing API controller (asp.net 5, xunit)单元测试 API 控制器时对象未设置为引用(asp.net 5,xunit)
【发布时间】:2016-04-26 02:03:10
【问题描述】:

大家好,我是测试新手,所以请放轻松:)。我无法测试我的 api 控制器。我创建了一个单独的类来测试控制器,但我遇到了“对象引用未设置为有效实例”的问题

我要测试的api控制器和方法:

namespace Project.Controllers.Api
{
    [Authorize]
    [Route("/api/entries/{date}")]
    public class EntryController : Controller
    {
        private ILogger<EntryController> _logger;
        private ITrackerRepository _repository;

        public EntryController(ITrackerRepository repository, ILogger<EntryController> logger)
        {
            _repository = repository;
            _logger = logger;
        }

        [HttpGet("")]
        public JsonResult Get(string date)
        {
            // DateTime date mm/dd/yyyy
            DateTime dateTime = Convert.ToDateTime(date);
            var result = Mapper.Map<IEnumerable<EntryViewModel>>(_repository.GetDiaryEntries(dateTime, User.Identity.Name));

            if (result != null)
            {
                return Json(result);
            }
            else
            {
                return Json(null);
            }
        }
}

我尝试使用 xunit 进行单元测试:

namespace test.Project.UnitTests
{
    public class EntryControllerTest
    {

        public EntryControllerTest()
        {
        }

        [Fact]
        public void TestInvalidViewModels()
        {
            // Created test mock/empty repository
            TestProjectRepository testRepo = new TestProjectRepository();
            var controller = new EntryController(testRepo, null);
            var result = controller.Get("01/12/1899");
            Assert.Equal(result, null);
        }
    }
}

我在 Controller.cs 文件中遇到“对象引用未设置为对象的实例”的问题。非常感谢您的帮助,谢谢。

【问题讨论】:

  • 控制器中的哪一行抛出了 NullReference 异常?也许它与记录器有关;当您从测试中创建 EntryController 时,它作为“null”传入。
  • @denvercoder9 我也猜到了记录器,但注意到在显示的示例中没有使用它。在测试设置中没有为控制器定义User 来访问,并且有对User.Identity.Name 的调用,所以这可能是罪魁祸首。前提是 OP 没有排除任何其他重要细节。

标签: c# asp.net unit-testing


【解决方案1】:

从您的代码来看,User.Identity.Name 是您最可能的错误原因。

[Fact]
public void TestInvalidViewModels()
{
    //Arrange        
    var username = "username@example.com";
    var identity = new GenericIdentity(username, "");
    var fakeUser = new GenericPrincipal(identity, roles: new string[] { });

    TestProjectRepository testRepo = new TestProjectRepository();
    var controller = new EntryController(testRepo, null);
    controller.User = fakeUser;
    //Act
    var result = controller.Get("01/12/1899");
    //Assert
    Assert.Equal(result, null);
}

【讨论】:

  • 你是对的,是身份导致了问题。谢谢!
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
相关资源
最近更新 更多