我正在为 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 数据库,只是简单的列表。我不确定这个细节是否有帮助。
无论如何,如果有人能给我一些帮助,我将非常感激,因为我对此是新手。
您将
result
软铸成 ObjectResult
。 as
casting 尝试进行强制转换,如果失败则返回强制转换类型的默认值(在本例中为 null)。
由于您试图断言您的
result
是 CreatedAtRouteResult
,因此并不真正需要将其预先转换为某种东西。然后,您的测试将以对您来说更有意义的方式失败。