我一直在研究我正在为Angular(我的第一个)做的项目的单元测试。我已经设置了一个依赖于NodeFactory的DataTree服务,并且还进行$ http调用。
首先,我的测试(摘录):
describe("the data tree service", function() {
let DataTree, NodeFactory, $httpBackend;
beforeEach(module('memApp.common'));
beforeEach( inject(function(_DataTree_, _NodeFactory_, _$httpBackend_) {
DataTree = _DataTree_;
NodeFactory = _NodeFactory_;
$httpBackend = _$httpBackend_;
}));
describe("is sane, so it", function() {
$httpBackend
.when('GET', 'json/home.json')
.respond(200, {
"esv": {
"_title" : "ESV",
"_filePath" : "json/bookData.json"
}
});
...
}
...
}
它正在尝试使用JSON设置模拟后端。
我的Karma测试在$ httpBackend.when失败了,特别是:
TypeError: Cannot read property 'when' of undefined
at <the httpBackend.when call>
我的DataTree服务(服务服务 - 只需要一个全局实例):
(function() {
angular.module('memApp.common')
.service('DataTree', ['NodeFactory', '$http', '$q',
function(NodeFactory, $http, $q) {
...
}]);
})();
我的NodeFactory工厂 - 类的包装器:
(function() {
angular.module('memApp.common')
.factory('NodeFactory', function() {
....
});
})();
最后,我收录了karma.conf.js文件:
files: [
'bower_components/angular/angular.min.js',
'bower_components/angular-mocks/angular-mocks.js',
'bower_components/angular-route/angular-route.js',
'js/common/common.module.js', //memApp.common module def'd here
'js/common/node.service.js', //NodeFactory def'd here
'js/common/datatree.service.js', //DataTree def'd here
'js/common/common.controller.js',
'js/hierarchy/hierarchy.module.js',
'js/hierarchy/hierarchy.controller.js',
'js/rehearsal/rehearsal.module.js',
'js/rehearsal/rehearsal.controller.js',
'js/app/app.module.js',
'js/hierarchy/hierarchy.directive.js',
'js/rehearsal/rehearsal.directive.js',
'spec/*Spec.js' //all Jasmine tests here - in particular, there is a test suite for NodeFactory here.
],
我不认为这是相关的,但是NodeFactory的测试会做到以下几点(我之前已经被其他测试所做的灼烧......):
describe("the Node service", function() {
let NodeFactory;
let home;
beforeEach(module('memApp.common'));
beforeEach( inject(function(_NodeFactory_) {
NodeFactory = _NodeFactory_;
home = NodeFactory.create();
}));
...
});
我已经在我的数据树服务中进行了测试,无需使用$ httpBackend进行任何操作。这种情况让我担心,因为我认为我的服务不应该在单元测试中进行实际的$ http调用?
我是ng-mock的新手(并且正在参加关于这个主题的PluralSight课程),但是我试图跟进我的项目,这阻碍了我做多少事情。一般来说,$ httpBackend仍然感觉有点神奇。
答案 0 :(得分:1)
嗯,嘿......写出我的问题有时会在很长的路要走。 (我发誓花了一天时间看这个。)
我对$ httpBackend的调用没有包含在测试中(只是一个描述块),所以之前没有调用beforeEach。我将代码移动到它...测试,现在注入工作。