在Web表单到MVC的迁移过程中,被分配了一个任务,那就是为测试网站找到一个有效的测试方法。之后,与不同的公司合作,发现这种方法可以帮助简化单元测试,减少重复工作。将分享这种方法,并希望了解看法。
这种方法不是集成测试,而是为了最小化重复工作,以便用较少的努力维护单元测试用例。大多数时候,更新测试用例或编写具有相同模式的类的测试用例(仅插入、更新、删除、查看,没有太多复杂逻辑)是非常乏味和重复的。
示例代码非常简单,可以根据需要进行改进。代码可在以下GitHub链接中找到:
应该具备以下知识:
使用IOC创建模拟对象,可以减少维护测试用例的工作量,有助于保持代码的一致性,这在基于Scrum的项目中非常有用。
在传统方法中,经常会遇到大量重复的代码,需要模拟依赖关系。保持测试用例的更新需要相当大的努力。这可能会导致失去对测试业务案例的专注。
不是为每个测试模拟每个方法并决定输出,而是使用Nbuilder生成的内存数据库,并使用IOC处理依赖关系。
也不使用MOQ模拟服务层方法,而是使用所有方法调用被模拟为使用内存数据库的存储库层。
让从底层开始。示例代码涵盖了用户表,可在GitHub上找到:
需要为每个映射到数据库表的实体模型创建模拟数据。
为用户表创建一些模拟记录。
创建一个类来在集合中存储模拟记录。
在这里,设置了存储库方法,而不是硬编码结果。进行与方法相关的简单操作。这种方法减少了大量重复代码和维护工作。
在这里,将接口映射到生成的模拟对象,这些对象也存储了模拟数据。
在实际项目中,这种方法可以以多种方式实现。不必完全实现它。如果不同意这种方法的100%,那么也可以选择使用IOC创建模拟对象或存储库层测试用例等一些内容。
请告诉对这种应用架构的看法和建议。
将撰写一篇文章,演示如何为旧项目编写测试用例,其中方法名称不统一。
// 创建内存模拟数据库
var mockData = new List<User> {
new User { Id = 1, Name = "Alice", Email = "alice@example.com" },
new User { Id = 2, Name = "Bob", Email = "bob@example.com" }
};
// 创建模拟存储库对象
var mockRepository = new Mock<IUserRepository>();
mockRepository.Setup(repo => repo.GetAllUsers()).Returns(mockData);
// IOC接口和类映射
var container = new Container();
container.Register<IUserRepository, MockUserRepository>();
// 创建IOC容器
var iocContainer = new IoCContainer(container);
// 编写测试用例
[TestMethod]
public void TestServiceLayer() {
var service = new UserService(iocContainer.Resolve<IUserRepository>());
var users = service.GetAllUsers();
Assert.AreEqual(2, users.Count);
}
[TestMethod]
public void TestRepositoryLayer() {
var repository = new MockUserRepository();
var users = repository.GetAllUsers();
Assert.AreEqual(2, users.Count);
}
[TestMethod]
public void TestMVCController() {
var controller = new UserController(iocContainer.Resolve<IUserService>());
var result = controller.Index();
Assert.IsInstanceOfType(result, typeof(ViewResult));
}