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

mcvgt66p  于 5个月前  发布在  .NET
关注(0)|答案(1)|浏览(75)

我正在用ASP编写一个TDD应用程序的测试。然而,当我测试一个Create(Post)控制器时,服务器返回给我:

Assert.IsAssignableFrom() Failure: Value is null.

字符串
这里是repository:

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库,也没有使用内存数据库,只是简单的列表。我不确定这个细节是否有帮助。
不管怎样,如果有人能给我一些帮助我会很感激的因为我是新手。

x3naxklr

x3naxklr1#

您将result软转换为ObjectResultas转换尝试转换,如果失败,则返回转换类型的默认值(在本例中为null)。
因为你试图Assert你的result是一个CreatedAtRouteResult,所以没有真实的需要将它预先转换成某种东西,你的测试将以一种更有意义的方式失败。

相关问题