使用Jasmine进行Angular控制器的单元测试示例

需积分: 3 3 下载量 134 浏览量 更新于2024-09-12 收藏 4KB TXT 举报
在AngularJS中,单元测试是一种重要的实践,它确保代码的正确性和可靠性。本篇文章将详细介绍如何使用Jasmine库来编写针对Angular控制器的单元测试,特别是针对名为"PhoneListCtrl"和"StockListCtrl"的两个控制器。 首先,我们来看看"PhoneListCtrl"控制器。该控制器定义在controllers.js文件中,其功能是返回一个电话列表,其中包含三个对象,每个对象有"name"和"snippet"属性。在Jasmine测试中,我们将关注控制器的行为是否按预期工作,例如检查电话列表是否被正确地注入到$scope中。 ```javascript describe("PhoneListCtrl", function() { var $scope, controller; beforeEach(angular.mock.module('angularjstest')); beforeEach(inject(function(_$controller_) { $scope = {}; controller = _$controller_('PhoneListCtrl', { $scope: $scope }); })); it("should initialize phones array with expected data", function() { expect($scope.phones.length).toBe(3); expect($scope.phones[0].name).toBe('NexusS'); // 添加更多的断言以检查每个对象的snippet属性 }); }); ``` 接下来,"StockListCtrl"控制器与"stockService"工厂结合使用,通过$http服务从远程服务器获取股票数据,并将结果存储在$Scope的"stocks"变量中。为了测试这个过程,我们需要模拟$http.get请求并验证数据是否正确加载。 ```javascript describe("StockListCtrl with stockService", function() { var $scope, $httpBackend, stockService; beforeEach(angular.mock.module('angularjstest')); beforeEach(inject(function(_$controller_, _$httpBackend_, _stockService_) { $scope = {}; $httpBackend = _$httpBackend_; stockService = _stockService_; stockService.getStocks(); })); beforeEach(function() { $httpBackend.whenGET('stocks.json').respond([{ name: 'Stock1' }, { name: 'Stock2' }]); }); afterEach(function() { $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); }); it("should fetch stocks from the service and set them to $scope.stocks", function() { $httpBackend.flush(); expect($scope.stocks.length).toBe(2); // 检查stocks数组中的数据 }); }); ``` 这部分内容展示了如何使用Jasmine进行Angular控制器的单元测试,包括设置模块、创建控制器实例、模拟HTTP请求以及编写断言来验证预期的行为。通过这样的测试,开发者可以更好地理解代码的工作原理,并确保其在改动后仍然能够正常运行。同时,单元测试也是AngularJS开发中的最佳实践,有助于提升代码质量和维护性。