首页 > 解决方案 > 单元测试:使用谓词对列表执行 FindAll 时出现空引用异常

问题描述

我在抽象类 FakeEntityBaseRepository 中有一个方法,名为 FindBy,代码如下:

    public IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate, params string[] includeProperties)
    {
        Func<T, bool> func = predicate.Compile();
        Predicate<T> pred = func.Invoke;

        var result = list.FindAll(pred);

        if (result == null)
        {
            list.Clear();
            return list;
        }

        return result;
    }

在将上面的代码更新为现在的代码后,我有几个单元测试失败,示例测试将编写如下:

[Test]
        public void GetSequencedParts_WhenCalled_ReturnsAllSequencedParts()
        {
            // Arrange
            PartController partController = GetController(null, null, null, null);

            // Act
            OkObjectResult result = (OkObjectResult)partController.GetSequencedParts();

            // Assert
            Assert.IsInstanceOf<List<PartViewModel>>(result.Value);
            List<PartViewModel> PartList = (List<PartViewModel>)result.Value;
            Assert.AreEqual(1, PartList.Count);
        }

控制器方法如下所示:

    [HttpGet("sequenced")]
    public IActionResult GetSequencedParts()
    {
        try
        {
            IEnumerable<Part> parts = partRepository
                .FindBy(x => x.Sequences.Count > 0, "SomeString", "SomeString2")
                .ToList();

            IEnumerable<PartViewModel> partVMs = Mapper.Map<IEnumerable<Part>, IEnumerable<PartViewModel>>(parts);
            return new OkObjectResult(partVMs);
        }
        catch (Exception ex)
        {
            return new BadRequestObjectResult(ex);
        }
    }

我收到此特定方法的异常。我应该提到 FindBy 方法适用于其他单元测试,但在这几个单元测试中失败了。

该异常是 NullReferenceException 的一种类型,并且附加了以下堆栈跟踪消息:

at lambda_method(Closure , Part )
   at System.Collections.Generic.List`1.FindAll(Predicate`1 match)
   at API.Tests.Fakes.FakeEntityBaseRepository`1.FindBy(Expression`1 predicate, String[] includeProperties) in C:\Jake_Projects\API\JakeUnitTestsRecovery\API.Tests\Fakes\FakeRepositories\FakeEntityBaseRepository.cs:line 82
   at API.Controllers.PartController.GetSequencedParts() in C:\Jake_Projects\API\JakeUnitTestsRecovery\API\Controllers\PartController.cs:line 68

感谢您的时间,

杰克

标签: c#unit-testingnunitnullreferenceexceptionpredicate

解决方案


推荐阅读