我正在使用AngularJS中的Jasmine编写我的第一个单元测试。我已经有一些控制器,服务等,我正在尝试验证它们(我知道:首先测试,然后编写代码,但正如我所说,我是单元测试的新手,并希望通过单元测试进一步开发我的应用程序)。
在我的情况下,我有两个控制器的视图,如
<div ng-controller="firstCtrl">
<div ng-controller="secondCtrl"></div>
</div>
在每次页面加载时,我检查routeParameters并从WebAPI获取数据(这由第一个控制器完成)。我的第二个控制器基于数据,该数据由第一个Ctrl设置为$ scope。
我的问题是,如何以优雅的方式为secondCtrl编写单元测试?我还有第三个,第四个控制器,它依赖于第一个控制器设置的数据。如果没有必要,我不想要重复的代码。
第二个控制器:
angular.module("myApp.controllers.secondController", ["myApp.Model"])
.controller("secondController", function ($scope, Model) {
$scope.data.Model = Model;
$scope.doSomething = function () {
// tries to grab something from the scope, which would normally be set by the first Controller, e.g.
return $scope.firstCtrlData.x;
};
});
规范文件:
describe('My App', function () {
beforeEach(angular.mock.module('myApp'));
describe("Controller", function () {
var controller, scope;
beforeEach(inject(function ($rootScope, $controller, _Model_) {
scope = $rootScope.$new();
controller = $controller("secondCtrl", {
scope: $scope,
Model: _Model_
});
}));
it('ensures that Model is in scope.data defined', function () {
expect($scope.data.Model).toBeDefined();
});
it('doSomething() does something', function () {
var x = $scope.doeSomething();
expect(x).toBeDefined();
// this will fail
});
});
});
它不仅仅是一个'x' - Value,它将是json Code中给出的整个数据结构,所以它可能不是最好的方法,只需将我的所有数据放在一个模拟的范围对象中...... / p>
由于我也是角色的新手,它可能甚至不是整个应用程序有两个控制器的最佳方法,但对我来说它似乎是最短和最有效的变体。