【发布时间】:2018-09-03 07:17:02
【问题描述】:
这里我有一个场景,我必须在我的控制器操作中调用另一个函数来实现某些输入目的。 如下。
public IActionResult Dashboard()
{
try
{
var allStuds = repository.GetAllStudentss();
var result = getFirstClassResult(allStuds);
return View("Dashboard", result );
}
catch (Exception ex)
{
return View();
}
}
public List<DashboardViewModel> getFirstClassResult(List<DashboardViewModel> model)
{
return students.OrderByDescending(x=>x.ExamDate).ToList();
}
这是我的 tets 盒子里的代码。
var controller = new StudentController(repositoryMock.Object, null, sessionManagerMock.Object);
var date = new DateTime();
var model= new List<DashboardViewModel>
controller.ControllerContext.HttpContext = GetHttpContext(CreateSessionMock(true), authenticationServiceMock);
controller.TempData = new TempDataDictionary(controller.ControllerContext.HttpContext, Mock.Of<ITempDataProvider>());
controller.Url = GetUrlHelper();
contextMock.Setup(mock => mock.GetAllStudents()).Returns(model);
var repository = new StudentRepository(factoryMock.Object);
var res = repository.GetAllStudents();
var result = controller.Dashboard() as ViewResult;
Assert.Equal("Dashboard", result.ViewName);
在这里我正在编写测试用例,我必须在其中模拟getFirstClassResult(allStuds) 方法。
这是我做不到的。
【问题讨论】:
-
通常你不能模拟一个非虚拟成员,因为模拟只是创建一个从你模拟的类型派生的类型。但是它应该如何为您无法覆盖的东西创建覆盖?这是不可能的。除此之外,“我不能这样做”不是一个正确的问题描述。请详细说明您尝试过的具体内容以及得到的结果。
-
此外,您通常不应该模拟被测系统,即您要测试的类。
-
好的,但是如果我想为上述场景编写测试用例呢?
-
好吧,我看不到太多场景。但是,您似乎不想模拟您的
getFirstClassResult-method,而是模拟数据库层,这意味着您的情况下的repository.GetAllStudents-method。为什么不简单地嘲笑这个 inetad 只返回几个学生呢?
标签: c# unit-testing tdd