我的应用程序
我的应用程序设计如下所示:
- Web 应用程序层 - 带有使用 POCO 和调用服务的控制器和视图的 asp.net MVC 应用程序
- 服务层 - 使用 POCO 和调用存储库的业务流程
- 数据层 - 使用 POCO 并以 EF 模型形式与模型进行通信的存储库,EF 模型是同一层的一部分
- POCO 层 - 定义用于这些层之间相互通信的所有类
所以我的数据层对于数据模型实现是完全透明的,因为上层根本不使用数据实体。
Testing
据我所知,单元、集成和系统测试(与 Asp.net MVC 相关)是这样的:
- 单元测试——这个很简单。模拟解耦对象并将它们注入单元测试中,以便测试单元将使用它们
- 集成测试 - 应该创建一组生产功能单元并模拟其余部分:因此编写集成测试来测试控制器、服务和存储库集成,而无需实际使用生产数据库
- 系统测试 - 在所有层上运行测试而不进行任何模拟,这意味着我也必须使用生产(测试)数据库
Problem
我可以很容易地看到如何编写单元测试和系统测试,但我不知道如何编写集成测试?也许我对这些的看法是完全扭曲的,我根本不理解它们。
应如何为 Asp.net MVC 应用程序编写集成和系统测试?
或者任何与此相关的 .net 应用程序?
一些有助于解释问题的代码
假设我有这样的课程:
-
TaskController
呼叫TaskService
-
TaskService
呼叫TaskRepository
-
TaskRepository
在内部操作 EF 数据
这是我的(缩写)课程:
public class TaskController
{
private ITaskService service;
// injection constructor
public TaskController(ITaskService service)
{
this.service = service;
}
// default constructor
public TaskController() : this(new TaskService()) {}
public ActionResult GetTasks()
{
return View(this.service.GetTasks());
}
...
}
public class TaskService : ITaskService
{
private ITaskRepository repository;
// injection constructor
public TaskService(ITaskRepository repository)
{
this.repository = repository;
}
// default constructor
public TaskService() : this(new TaskRepository()) {}
public IList<Task> GetTasks()
{
return this.repository.GetTasks();
}
...
}
public class TaskRepository : ITaskRepository
{
public IList<Task> GetTasks()
{
// code that gets tasks from EF and converts to Task POCOs
}
...
}
单元测试很简单,如下所示:
public void UnitTest()
{
var mock = new Mock<ITaskService>();
// other code that mocks the service
TaskController controller = new TaskController(mock.Object);
// do the test
}
但是当涉及到集成测试时,我如何仅模拟集成的某些部分。
public void IntegrationTest()
{
// no mocking at all
TaskController = new TaskController();
// do some testing
}
首先,我不能在这里模拟数据库吗?我可以模拟存储库并拥有真正的服务和控制器......
集成测试应该测试组件之间的集成。单元测试测试单个组件的各个部分,而集成测试组件之间的交互,并且旨在实时工作。因此,集成测试将利用数据库和任何其他外部依赖项,最好在单元测试中模拟这些服务。
对我来说,系统测试是功能测试(使用 fit 之类的测试的另一个级别),或者通过 testcomplete 或 telerik 的 QA 工具等工具进行 ui 测试。
HTH.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)