如何修复 Xunit 测试中的“Assert.IsAssignableFrom() Failure: Value is null”?

问题描述 投票:0回答:1

我正在为 Asp 中的 TDD 应用程序编写一些测试。但是,当我测试 Create(Post) 控制器时,服务器返回我:

 Assert.IsAssignableFrom() Failure: Value is null.

这是存储库:

public class Repository
{
     private IList<Subject> _subjects = new List<Subject>()
     {
        new Subject() { 
            SubjectId = Guid.Parse("1fe63de5-4408-4d7b-a40a-bad231b7bd9f"), 
            Title = "Math", 
            Credits = 8
            },
        
        new Subject() { 
            SubjectId = Guid.Parse("de331c36-6b31-4dd9-b50d-f677e51b987c"), 
            Title = "Chemistry", 
            Credits = 10,
             Teacher = new Teacher(){
                  Dni = 2210890,
                  FirstName = "Albert",
                  SurName = "Einstein",
                  Email = "[email protected]",
                },
              Students = new List<Student>()
             {
                new Student() {
                    FirstName = "Cristiano",
                    SurName = "Ronaldo",
                    Email = "[email protected]",
                    EnrollmentDate = DateTime.UtcNow
                },  

                new Student()
                {
                    FirstName = "Leonel",
                    SurName = "Messi",
                    Email = "[email protected]",
                    EnrollmentDate = DateTime.UtcNow
                }               
             }
            }
     };

这是控制器:

[Route("api/[controler]/[action]")]
[ApiController]
public class SubjectController : ControllerBase
{
    private Repository _repo;
   
    public SubjectController(Repository repo)
    {
        _repo = repo;
    }

    public IActionResult CreateSubject(Subject subject)
    {
        if(subject == null)
        {
            Console.WriteLine("Subject Object sent is null");
        }

        _repo.Create(subject);
       
       return RedirectToAction(nameof(Index));
    }
}

最后这是xUnit测试代码:

public class UnitTest2
{
    private SubjectController _context;
    private Repository _repo;  
    public UnitTest2()
    { 
        _repo = new Repository();
        _context = new SubjectController(_repo);
    }
    [Fact]     
    public void CreateSubjectTest()
    {
        //Arrange
        var subject = new Subject()
        {
            SubjectId = Guid.Parse("761c6dc1-4b02-4db5-bf91-5452efb44c1a"),
            Title = "History", 
            Credits = 10,
        };

        //Act
        var result = _context.CreateSubject(subject) as ObjectResult;       
        
        //Assert
        Error Message: Assert.IsAssignableFrom() Failure: Value is null
        Expected: typeof(Microsoft.AspNetCore.Mvc.CreatedAtRouteResult)
        Actual:   null
        Assert.IsAssignableFrom<CreatedAtRouteResult>(result);
        Assert.Equal((int)HttpStatusCode.Created, result!.StatusCode);
    } 

};

我必须提到,我没有使用 Moq 库或 Memory 数据库,只是简单的列表。我不确定这个细节是否有帮助。

无论如何,如果有人能给我一些帮助,我将非常感激,因为我对此是新手。

c# asp.net .net unit-testing xunit
1个回答
0
投票

您将

result
软铸成
ObjectResult
as
casting 尝试进行强制转换,如果失败则返回强制转换类型的默认值(在本例中为 null)。

由于您试图断言您的

result
CreatedAtRouteResult
,因此并不真正需要将其预先转换为某种东西。然后,您的测试将以对您来说更有意义的方式失败。

© www.soinside.com 2019 - 2024. All rights reserved.