【发布时间】:2015-08-27 08:47:26
【问题描述】:
下面是我要测试的设置。
控制器:
public ActionResult UpsertStudent(StudentModel studentModel)
{
try
{
if (!CheckStudentUpdateForEdit(studentModel))
{
return Json(new { result = STUDENT_EXISTS });
}
// remaining code removed for brevity
}
private bool CheckStudentUpdateForEdit(StudentModel studentModel)
{
var returnVal = true;
var existingStudent = _updateStudentManager.GetStudentInfo(studentModel.Id);
if (existingStudent.StudentType == "Day Scholar")
{
returnVal = true;
}
else
{
returnVal = false;
}
return returnVal;
}
测试方法:
public void AllowStudentUpdates_Success()
{
var studentModel = new StudentModel()
{
StudentName = "Joe",
Id = "123",
StudentType = "Day Scholar"
};
var studentToAdd = new Student()
{
Id = "123",
Name = "Joe",
StartDate = DateTime.UtcNow.ToShortDateString(),
StudentType = "Day Scholar",
EndDate = "08/10/2016"
};
_studentRulesHelper.Setup(x => x.GetStudentRule(studentModel, true)).Returns(studentToAdd);
_productRulesHelper.Setup(x => x.ReturnStudentRule(studentModel, true)).Returns(studentToAdd);
var res = _controller.UpsertStudent(studentModel) as JsonResult;
if (res != null) Assert.AreEqual("{ result = True }", res.Data.ToString());
}
当它遇到UpsertDoc 调用时,它会转到控制器中的实际调用并尝试执行CheckStudentUpdateForEdit() GetStudentInfo() 尝试从数据库中获取一个对象并返回一个空对象,因为没有学生使用从测试方法传递的 id。
然后测试因空引用异常而失败。
现在被测系统不应该访问数据库。我不知道为什么会这样!
编写此测试的任何其他人也将尝试传递一个虚拟对象,该对象肯定会在 GetStudentInfo() 处失败,就像现在设置测试的方式一样。
我该怎么做才能完成这项工作?
【问题讨论】:
-
如果没有具有该 ID 的学生,那么我会说您的测试已成功识别出错误。您需要处理
existingStudent为空的情况。如果代码被破坏,那么编辑测试以使其正常工作是没有意义的。 -
在实际使用中这永远不会发生,因为总会有一个学生。
-
你想模拟上下文吗?
-
这是正确的代码吗?您有
_controller.UpsertDoc(),但没有显示任何具有该名称的方法。您有.Setup(x => x.GetStudentRule)和.Setup(x => x.ReturnStudentRule)但没有显示这些方法 -
编辑了通话。另外两个只是从一个对象到另一个对象的映射器,没有任何业务逻辑。
标签: asp.net-mvc unit-testing moq