Tom*_*cer 7 javascript unit-testing jasmine angularjs angular-ui-bootstrap
我正在尝试编写一个单元测试,断言正确的变量被发送到Angular-UI Bootstrap组件的resolve
属性ui.bootstrap.modal
.这是我到目前为止:
// Controller
angular.module('app')
.controller('WorkflowListCtrl', function ($scope, $modal) {
// Setup the edit callback to open a modal
$scope.edit = function(name) {
var modalInstance = $modal.open({
templateUrl: 'partials/editWorkflowModal.html',
controller: 'WorkflowEditCtrl',
scope: $scope,
resolve: {
name: function() { return name; }
}
});
};
});
Run Code Online (Sandbox Code Playgroud)
值得注意的是,该resolve.name
属性必须是Angular-UI组件正常工作的功能 - 以前我曾尝试resolve: { name: name }
但这不起作用.
// Unit Test
describe('Controller: WorkflowListCtrl', function () {
// load the controller's module
beforeEach(module('app'));
var workflowListCtrl,
scope,
modal;
// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
modal = {
open: jasmine.createSpy()
};
workflowListCtrl = $controller('WorkflowListCtrl', {
$scope: scope,
$modal: modal
});
it('should allow a workflow to be edited', function() {
// Edit workflow happens in a modal.
scope.edit('Barney Rubble');
expect(modal.open).toHaveBeenCalledWith({
templateUrl: 'partials/editWorkflowModal.html',
controller: 'WorkflowEditCtrl',
scope: scope,
resolve: {
name: jasmine.any(Function)
}
});
});
}));
});
Run Code Online (Sandbox Code Playgroud)
目前,这只是检查resolve.name
属性是一个函数,但我真正想做的是断言resolve.name
函数返回Barney Rubble
.这种语法显然不起作用:
expect(modal.open).toHaveBeenCalledWith({
templateUrl: 'partials/editWorkflowModal.html',
controller: 'WorkflowEditCtrl',
scope: scope,
resolve: {
name: function() { return 'Barney Rubble'; }
}
});
Run Code Online (Sandbox Code Playgroud)
似乎我想以某种方式想要监视resolve.name
函数来检查它是否被调用,Barney Rubble
但我无法找到一种方法来做到这一点.有任何想法吗?
所以我找到了一种方法来做到这一点.
在以下位置定义'私人'功能$scope
:
$scope._resolve = function(item) {
return function() {
return item;
};
};
Run Code Online (Sandbox Code Playgroud)
修改原始$scope
函数以调用此"私有"方法:
$scope.edit = function(name) {
var modalInstance = $modal.open({
templateUrl: 'partials/modal.html',
controller: 'ModalCtrl',
scope: $scope,
resolve: {
name: $scope._resolve(name)
}
});
};
Run Code Online (Sandbox Code Playgroud)
更新您的测试以模拟此函数并返回原始值,然后您可以测试它是否正确传递.
it('should allow a workflow to be edited', function() {
// Mock out the resolve fn and return our item
spyOn($scope, '_resolve').and.callFake(function(item) {
return item;
});
// Edit workflow happens in a modal.
scope.edit('Barney Rubble');
expect(modal.open).toHaveBeenCalledWith({
templateUrl: 'partials/modal.html',
controller: 'ModalCtrl',
scope: scope,
resolve: {
name: 'Barney Rubble'
}
});
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3653 次 |
最近记录: |