AngularJs 测试(Chai+Karma):一些作用域变量没有更新
AngularJs tests (Chai+Karma): some scope variables are not updated
我有一个控制器设置变量如下:
terminalController.controller('GeneralSettingsController', [ '$rootScope', '$scope', 'GeneralSettingsService', 'getGeneralSettings',
function($rootScope, $scope, GeneralSettingsService, getGeneralSettings) {
getGeneralSettings.get().$promise.then(function (response) {
$scope.connectionsettings = response;
if(response.screenSaverOn == 'true') {
$scope.screenSaver = 'On';
} else {
$scope.screenSaver = 'Off';
}
});
}
]);
现在我想测试如果响应有 screenSaverOn == 'true',那么 $scope.screenSaver 将是 'On'
这是我的测试片段:
describe('GeneralSettingsController', function() {
var rootScope, getConnectionSettings, resp;
beforeEach(inject(function($controller,
$rootScope, _$httpBackend_) {
rootScope = $rootScope.$new();
$httpBackend = _$httpBackend_;
$controller('GeneralSettingsController', {
$rootScope : rootScope
});
$httpBackend.when('GET', 'ws/Admin/terminal/settings').respond(
{ response : {
"screenSaverOn" : true
}
});
}));
it('should call get connection settings when page is loaded', function() {
$httpBackend.flush();
assert.equal(rootScope.connectionsettings.response.screenSaverOn, true);
assert.equal(rootScope.screenSaver, 'On');
});
第一个断言成功,第二个断言失败,我做错了什么?
问题是您没有将所需的服务注入到控制器中。它正在调用 getGeneralSettings.get()
但从未注入 getGeneralSettings,因此这应该会导致错误。您只提供了 $rootScope。缺少 $scope、GeneralSettingsService、getGeneralSettings。
您必须提供您自己的模拟对象,该对象可以直接响应您想要的响应。并删除 HTTP 后端模拟,因为您没有使用 $http.
我有一个控制器设置变量如下:
terminalController.controller('GeneralSettingsController', [ '$rootScope', '$scope', 'GeneralSettingsService', 'getGeneralSettings',
function($rootScope, $scope, GeneralSettingsService, getGeneralSettings) {
getGeneralSettings.get().$promise.then(function (response) {
$scope.connectionsettings = response;
if(response.screenSaverOn == 'true') {
$scope.screenSaver = 'On';
} else {
$scope.screenSaver = 'Off';
}
});
}
]);
现在我想测试如果响应有 screenSaverOn == 'true',那么 $scope.screenSaver 将是 'On'
这是我的测试片段:
describe('GeneralSettingsController', function() {
var rootScope, getConnectionSettings, resp;
beforeEach(inject(function($controller,
$rootScope, _$httpBackend_) {
rootScope = $rootScope.$new();
$httpBackend = _$httpBackend_;
$controller('GeneralSettingsController', {
$rootScope : rootScope
});
$httpBackend.when('GET', 'ws/Admin/terminal/settings').respond(
{ response : {
"screenSaverOn" : true
}
});
}));
it('should call get connection settings when page is loaded', function() {
$httpBackend.flush();
assert.equal(rootScope.connectionsettings.response.screenSaverOn, true);
assert.equal(rootScope.screenSaver, 'On');
});
第一个断言成功,第二个断言失败,我做错了什么?
问题是您没有将所需的服务注入到控制器中。它正在调用 getGeneralSettings.get()
但从未注入 getGeneralSettings,因此这应该会导致错误。您只提供了 $rootScope。缺少 $scope、GeneralSettingsService、getGeneralSettings。
您必须提供您自己的模拟对象,该对象可以直接响应您想要的响应。并删除 HTTP 后端模拟,因为您没有使用 $http.