请求编写Jasmine(2.0)测试代码:AngularJS控制器Mock服务
没问题,我来帮你编写一套完整的Jasmine 2.0测试代码,用来Mock AngularJS控制器里的readJsonFactory服务,同时覆盖你提到的相关文件场景。测试文件命名为readjson.spec.js,以下是完整实现:
Jasmine 2.0 测试代码:Mock AngularJS控制器中的服务
测试文件:readjson.spec.js
// 针对ReadJsonController的测试套件 describe('ReadJsonController', function() { var $controller, $rootScope, readJsonFactoryMock; // 模拟AutoTestDB1.json的实际数据结构(请根据你的JSON文件调整) var mockAutoTestData = { products: [ { id: 'P001', name: 'Test Product 1', price: 99.99 }, { id: 'P002', name: 'Test Product 2', price: 199.99 } ], metadata: { version: '1.0', updated: '2024-05-20' } }; beforeEach(function() { // 加载你的Angular应用模块(替换成实际模块名) module('yourAppModuleName'); // 创建Mock版的readJsonFactory,模拟它的核心方法 readJsonFactoryMock = jasmine.createSpyObj('readJsonFactory', ['loadJsonFile']); // 注入测试所需的Angular服务 inject(function(_$controller_, _$rootScope_) { $controller = _$controller_; $rootScope = _$rootScope_; }); }); // 测试1:控制器初始化时是否正确调用了工厂的JSON加载方法 it('should trigger JSON loading via readJsonFactory on init', function() { // 实例化控制器,注入Mock服务 var $scope = $rootScope.$new(); $controller('ReadJsonController', { $scope: $scope, readJsonFactory: readJsonFactoryMock }); // 验证工厂方法是否被调用 expect(readJsonFactoryMock.loadJsonFile).toHaveBeenCalled(); // 如果你的方法需要传入文件名参数,还可以验证参数: expect(readJsonFactoryMock.loadJsonFile).toHaveBeenCalledWith('AutoTestDB1.json'); }); // 测试2:当工厂返回成功数据时,控制器是否正确处理并绑定到作用域 it('should assign fetched JSON data to $scope when load succeeds', function() { // 让Mock方法返回模拟的JSON数据 readJsonFactoryMock.loadJsonFile.and.returnValue(mockAutoTestData); var $scope = $rootScope.$new(); $controller('ReadJsonController', { $scope: $scope, readJsonFactory: readJsonFactoryMock }); // 验证作用域上的数据是否匹配模拟数据 expect($scope.dbData).toEqual(mockAutoTestData); expect($scope.dbData.products.length).toBe(2); expect($scope.dbData.metadata.version).toBe('1.0'); }); // 测试3:模拟加载失败场景,验证控制器的错误处理逻辑 it('should handle loading errors properly', function() { // 让Mock方法抛出错误 var mockError = new Error('Failed to load AutoTestDB1.json'); readJsonFactoryMock.loadJsonFile.and.throwError(mockError); var $scope = $rootScope.$new(); $controller('ReadJsonController', { $scope: $scope, readJsonFactory: readJsonFactoryMock }); // 根据你的控制器实际错误处理逻辑调整断言 expect($scope.loadError).toBe('Failed to load AutoTestDB1.json'); expect($scope.dbData).toBeUndefined(); }); });
关键调整说明:
- 模块名称替换:把代码里的
yourAppModuleName改成你Angular应用实际的模块名称。 - 方法名匹配:如果
readJsonFactory的核心方法不是loadJsonFile,请替换成你实际的方法名(比如getAutoTestData)。 - JSON结构对齐:
mockAutoTestData要和你的AutoTestDB1.json实际结构完全一致,这样测试断言才会准确有效。 - 错误处理适配:如果你的控制器没有错误处理逻辑,可以直接删除第三个测试用例,或者根据实际代码调整断言内容。
测试执行注意事项:
- 确保测试环境已加载
angular.js、angular-mocks.js和Jasmine 2.0的核心库。 - 在Karma或其他测试工具的配置文件中,要包含你的控制器文件、工厂文件以及这个测试文件。
内容的提问来源于stack exchange,提问作者aman jain
相关产品推荐
相关产品推荐

