gpt4 book ai didi

angularjs - 使用 Karma/Jasmine 对 modalInstance Controller 进行单元测试

转载 作者:行者123 更新时间:2023-12-03 10:32:02 30 4
gpt4 key购买 nike

编辑:这篇文章末尾的快速和肮脏的解决方案

我正在使用来自 AngularUI-Bootstrap 的模式窗口,其方式与网站上解释的方式相同,只是我拆分了文件。
因此我有:

调用 Controller .js:

$scope.delete = function () {
if ($scope.selected.length > 0) {
// [...]
// preparing data
// [...]
var modalInstance = $modal.open({
templateUrl: 'views/modalView.html',
controller: 'modalCtrl',
resolve: {
itemArray: function () {
return $scope.selected;
}
}
});
modalInstance.result.then(function (confirm) {
if (confirm === true) {
// [...]
// treat
// [...]
}
});
}
};

modalController.js :
myAppControllers.controller('modalCtrl',
function ($scope, $modalInstance, itemArray) {

$scope.accept = function () {
$modalInstance.close(true);
};

$scope.reject = function () {
$modalInstance.close(false);
};

$scope.itemArray = itemArray;

});

当我使用 Karma 测试此代码时(在 karma 配置文件中加载 ui-bootstrap-tpls.min.js 文件),我收到以下错误:
错误:[$injector:unpr] [http://errors.angularjs.org/1.2.15-build.2389+sha.c5f2f58/ $injector/unpr?p0=%24modalInstanceProvider%20%3C-%20%24modalInstance] 1在错误( native ) ,这意味着 jasmine 无法找到 $modalInstance 的提供者。

我什至没有在这个 Controller 上测试东西,还没有,但这是我的 jasmine 测试文件:

testModalController.js :
describe('Controller: modalCtrl', function () {

beforeEach(module('myApp'));

var Ctrl;
var scope;

// Initialize the controller and a mock scope
beforeEach(inject(
function ($controller, $rootScope) {
scope = $rootScope.$new();

Ctrl = $controller('modalCtrl', { $scope: scope });
})
);

describe('Initial state', function () {
it('should instantiate the controller properly', function () {
expect(Ctrl).not.toBeUndefined();
});

it('should initialize its values properly', function () {

});
});

});

你对这个问题有任何线索吗?这不是我使用(和测试)的第一个“外部”模块,我做了与其他模块相同的事情,只是这次它不起作用,我不知道为什么。

===========================================

编辑:快速且可能很脏的解决方案:

好的,所以基于 Jasmine Controller 实例化中的作用域模拟方法,我想出了如何“解决”我的问题,但它可能很脏,所以如果你找到更好的方法来做我想做的事,请随时发表评论.

testModalController.js :
describe('Controller: modalCtrl', function () {

beforeEach(module('myApp'));

var Ctrl;
var scope;
var modalInstance;

// Initialize the controller and a mock scope
beforeEach(inject(
function ($controller, $rootScope, _$modal_) {
scope = $rootScope.$new();
modalInstance = _$modal_.open({
templateUrl: 'views/modalView.html'
});

Ctrl = $controller('modalCtrl', {
$scope: scope,
$modalInstance: modalInstance,
itemArray: function () { return ['a', 'b', 'c']; }
});
})
);

describe('Initial state', function () {
it('should instantiate the controller properly', function () {
expect(Ctrl).not.toBeUndefined();
});

it('should initialize its values properly', function () {

});
});

});

这样,Jasmine 不再搜索提供者,因为您已经注入(inject)了应该需要这些提供者的项目。它有效,但我相信它可以以更好的方式完成......

最佳答案

我通过创建模拟 modal 来解决这个问题和 modalInstance对象并验证它们是否已被我的 Controller 代码调用。由于modalmodalInstance是第三方库的一部分,测试它们是否正常工作不是我们的责任 - 相反,我们有责任测试调用该库的代码是否正常工作。

使用您的示例:

describe('Controller: modalCtrl', function () {

beforeEach(module('myApp'));

var Ctrl;
var scope;
var modalInstance;

// Initialize the controller and a mock scope
beforeEach(inject(
function ($controller, $rootScope) { // Don't bother injecting a 'real' modal
scope = $rootScope.$new();
modalInstance = { // Create a mock object using spies
close: jasmine.createSpy('modalInstance.close'),
dismiss: jasmine.createSpy('modalInstance.dismiss'),
result: {
then: jasmine.createSpy('modalInstance.result.then')
}
};
Ctrl = $controller('modalCtrl', {
$scope: scope,
$modalInstance: modalInstance,
itemArray: function () { return ['a', 'b', 'c']; }
});
})
);

describe('Initial state', function () {
it('should instantiate the controller properly', function () {
expect(Ctrl).not.toBeUndefined();
});

it('should close the modal with result "true" when accepted', function () {
scope.accept();
expect(modalInstance.close).toHaveBeenCalledWith(true);
});

it('should close the modal with result "false" when rejected', function () {
scope.reject();
expect(modalInstance.close).toHaveBeenCalledWith(false);
});
});
});

这样一来,我们就不需要对 Angular-UI 对象有任何依赖,而且我们的单元测试很好而且隔离。

关于angularjs - 使用 Karma/Jasmine 对 modalInstance Controller 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22246813/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com