Karma-Jasmine:测试模式的关闭
Karma-Jasmine: Testing the closing of a modal
情况:
我正在测试我的 Angular / Ionic 应用程序中模态的正常工作。
到目前为止,我可以正确测试模态已被调用的事实,但我不知道如何测试模态是否正确关闭。
多次尝试并阅读了类似的问题,但没有找到解决方案。
代码:
控制器:
代码在应用程序中运行良好,刚刚重构以方便单元测试。
$scope.open_login_modal = function()
{
var temp = $ionicModal.fromTemplateUrl('templates/login.html',{scope: $scope});
temp.then(function(modal) {
$scope.modal_login = modal;
$scope.modal_login.show();
});
};
$scope.close_login_modal = function()
{
$scope.modal_login.hide();
};
测试:
第一个测试(开放模式)工作正常并通过。第二次测试不知道怎么做
describe('App tests', function()
{
beforeEach(module('my_app.controllers'));
// mocking the .then method of $ionicModal.fromTemplateUrl (it works)
function fakeTemplate()
{
return {
then: function(modal){
$scope.modal_login = modal;
}
}
}
beforeEach(inject(function(_$controller_, _$rootScope_)
{
$controller = _$controller_;
$rootScope = _$rootScope_;
$scope = _$rootScope_.$new();
$ionicModal =
{
fromTemplateUrl: jasmine.createSpy('$ionicModal.fromTemplateUrl').and.callFake(fakeTemplate)
};
var controller = $controller('MainCtrl', { $scope: $scope, $rootScope: $rootScope, $ionicModal: $ionicModal });
}));
describe('Modal tests', function()
{
it('should open login modal', function()
{
$scope.open_login_modal();
expect($ionicModal.fromTemplateUrl).toHaveBeenCalled();
expect($ionicModal.fromTemplateUrl.calls.count()).toBe(1);
});
it('should close login modal', function()
{
$scope.close_login_modal();
// How can i test here that the modal has been close?
});
});
});
错误:
这是错误信息:TypeError: Cannot read property 'hide' of undefined
问题:
如何测试模态框的关闭?
我如何确定函数 hide()
已被正确调用?
与测试中模态的声明有关?
非常感谢!
编辑:
这个答案正确地回答了问题 'how to test the closing of a modal',给出了在模式打开之前包含的正确解决方案。
如果你想知道如何正确地监视我在另一个问题中问过的模态:
给定的答案还给出了一般情况下如何监视前提的规则。
您的关闭测试要求模式登录已打开,但由于这没有发生,您会收到该错误:
我会重写你的测试:
describe('Modal tests', function() {
beforeEach(function(){
$scope.open_login_modal();
});
it('should open login modal', function() {
expect($ionicModal.fromTemplateUrl).toHaveBeenCalled();
expect($ionicModal.fromTemplateUrl.calls.count()).toBe(1);
});
it('should close login modal', function() {
$scope.close_login_modal();
spyOn($scope.modal_login, 'hide');
expect($scope.modal_login.hide()).toHaveBeenCalled();
});
});
所以两个测试都需要调用 open_login_modal 函数,所以我添加到 beforeEach。您还需要监视模态的隐藏功能。
情况:
我正在测试我的 Angular / Ionic 应用程序中模态的正常工作。
到目前为止,我可以正确测试模态已被调用的事实,但我不知道如何测试模态是否正确关闭。
多次尝试并阅读了类似的问题,但没有找到解决方案。
代码:
控制器:
代码在应用程序中运行良好,刚刚重构以方便单元测试。
$scope.open_login_modal = function()
{
var temp = $ionicModal.fromTemplateUrl('templates/login.html',{scope: $scope});
temp.then(function(modal) {
$scope.modal_login = modal;
$scope.modal_login.show();
});
};
$scope.close_login_modal = function()
{
$scope.modal_login.hide();
};
测试:
第一个测试(开放模式)工作正常并通过。第二次测试不知道怎么做
describe('App tests', function()
{
beforeEach(module('my_app.controllers'));
// mocking the .then method of $ionicModal.fromTemplateUrl (it works)
function fakeTemplate()
{
return {
then: function(modal){
$scope.modal_login = modal;
}
}
}
beforeEach(inject(function(_$controller_, _$rootScope_)
{
$controller = _$controller_;
$rootScope = _$rootScope_;
$scope = _$rootScope_.$new();
$ionicModal =
{
fromTemplateUrl: jasmine.createSpy('$ionicModal.fromTemplateUrl').and.callFake(fakeTemplate)
};
var controller = $controller('MainCtrl', { $scope: $scope, $rootScope: $rootScope, $ionicModal: $ionicModal });
}));
describe('Modal tests', function()
{
it('should open login modal', function()
{
$scope.open_login_modal();
expect($ionicModal.fromTemplateUrl).toHaveBeenCalled();
expect($ionicModal.fromTemplateUrl.calls.count()).toBe(1);
});
it('should close login modal', function()
{
$scope.close_login_modal();
// How can i test here that the modal has been close?
});
});
});
错误:
这是错误信息:TypeError: Cannot read property 'hide' of undefined
问题:
如何测试模态框的关闭?
我如何确定函数 hide()
已被正确调用?
与测试中模态的声明有关?
非常感谢!
编辑:
这个答案正确地回答了问题 'how to test the closing of a modal',给出了在模式打开之前包含的正确解决方案。 如果你想知道如何正确地监视我在另一个问题中问过的模态:
给定的答案还给出了一般情况下如何监视前提的规则。
您的关闭测试要求模式登录已打开,但由于这没有发生,您会收到该错误:
我会重写你的测试:
describe('Modal tests', function() {
beforeEach(function(){
$scope.open_login_modal();
});
it('should open login modal', function() {
expect($ionicModal.fromTemplateUrl).toHaveBeenCalled();
expect($ionicModal.fromTemplateUrl.calls.count()).toBe(1);
});
it('should close login modal', function() {
$scope.close_login_modal();
spyOn($scope.modal_login, 'hide');
expect($scope.modal_login.hide()).toHaveBeenCalled();
});
});
所以两个测试都需要调用 open_login_modal 函数,所以我添加到 beforeEach。您还需要监视模态的隐藏功能。