Я выполняю модульное тестирование для одного из моих методов в моем контроллере с использованием Moq и Nunit Framework. Я стараюсь понять концепцию Mocking repositories & других объектов, но не добился большого успеха.System.NullReferenceException-.Net (MVC) Mock Unit Test
У меня есть метод, который не позволяет пользователю удалять студента, у которого есть ожидающий остаток на его учетной записи. Логика метода находится в моем StudentController, в методе POST, и я также использую репозиторий и инъекцию зависимостей (не уверен, что это вызывает проблему). Когда я запускаю свой модульный тест, иногда он переходит к моему методу GET Delete()
, и если он идет на POST method
, я получаю сообщение об ошибке «Ссылка на объект, не установленная на экземпляр объекта» для строки кода, говорящей об этом if (s.PaymentDue > 0)
?
StudentController
public class StudentController : Controller
{
private IStudentRepository studentRepository;
public StudentController()
{
this.studentRepository = new StudentRepository(new SchoolContext());
}
public StudentController(IStudentRepository studentRepository)
{
this.studentRepository = studentRepository;
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(int id)
{
//studentRepository.DeleteStudent(id);
Student s = studentRepository.GetStudentByID(id);
var paymentDue = false;
if (s.PaymentDue > 0)
{
paymentDue = true;
ViewBag.ErrorMessage = "Cannot delete student. Student has overdue payment. Need to CLEAR payment before deletion!";
return View(s);
}
if (!paymentDue)
{
try
{
Student student = studentRepository.GetStudentByID(id);
studentRepository.DeleteStudent(id);
studentRepository.Save();
}
catch (DataException /* dex */)
{
//Log the error (uncomment dex variable name after DataException and add a line here to write a log.
return RedirectToAction("Delete", new { id = id, saveChangesError = true });
}
}
//return View(s);
return RedirectToAction("Index");
}
Единицы измерения Метод испытания
private int studentID;
[TestMethod]
public void StudentDeleteTest()
{
//create list of Students to return
var listOfStudents = new List<Student>();
listOfStudents.Add(new Student
{
LastName = "Abc",
FirstMidName = "Abcd",
EnrollmentDate = Convert.ToDateTime("11/23/2010"),
PaymentDue = 20
});
Mock<IStudentRepository> mockStudentRepository = new Mock<IStudentRepository>();
mockStudentRepository.Setup(x => x.GetStudents()).Returns(listOfStudents);
var student = new StudentController(mockStudentRepository.Object);
//Act
student.Delete(studentID);
////Assert
mockStudentRepository.Verify(x => x.DeleteStudent(studentID), Times.AtLeastOnce());
}
Вы знаете, что такое 'NullReferenceException'? Можете ли вы отладить и выяснить, какой объект является нулевым? – mason
Можете ли вы отлаживать и сообщать нам, на какой строке вы получаете ошибку? – Rinktacular
@ Rinktacular Он уже рассказал нам, в какой строке произошла ошибка. – mason