【发布时间】:2014-08-03 23:17:45
【问题描述】:
我们正在对我们的服务进行单元测试,并面临使用依赖服务参数监视方法的问题。
我正在为 ServiceA 编写单元测试
ServiceA.js
angular.module("App").service("ServiceA", function($http, ServiceB) {
this.detail = null;
this.method = function(id){
var sevrB = new ServiceB();
return sevrB.getId(1).then(function(response) {
this.detail = response.data;
});
};
});
ServiceB.js(是工厂)
(function () {
var dependencies = [
'../module'
];
define(dependencies, function (module) {
return module.factory('ServiceB', function ($http) {
var ServiceB= function () {
this.id = null;
};
ServiceB.prototype.getId = function(Id) {
return $http.get('/test/');
}
}
}());
单元测试代码
describe('Testing ServiceA', function () {
var serviceA, serviceBMock;
beforeEach(function () {
var _serviceBMock = function () {
return {
getId:function(id){
return 'test';
}
};
};
angular.module('ServiceAMocks', [])
.value('ServiceB', _serviceBMock);
});
beforeEach(module('ServiceAMocks'));
beforeEach(inject(function (_ServiceA_, _ServiceB_) {
serviceA=_ServiceA_;
serviceBMock=_ServiceB_;
});
it('retrive Id', function () {
spyOn(serviceBMock,'getId').and.Return('test');
serviceA.method(1);
});
});
我正在从 ServiceA 监视 ServiceB 的 getId 方法,如果我将 ServiceB 模拟为函数,我会收到以下错误
错误:getId() 方法不存在 在 jasmineInterface.spyOn
如果我将 serviceB 模拟为对象,那么我会得到错误
TypeError: object is not a function
var _serviceBMock = {
getId:function(id){
return 'test';
}
}
而且我不确定在这种情况下测试承诺。
【问题讨论】:
-
这是否正确:
return ServiceB.getId(1)?建议回ServiceB.getId(id) -
我的 ServiceB 是一个工厂,充当对象模型,我在 Service A 中使用 new 运算符创建了这个工厂的实例。我已经编辑了上面的内容。
-
只要不从工厂返回函数,就不需要用 new 调用工厂。
-
谢谢,我已经在上面的内容中更新了我的 SevriceB 工厂的确切定义,并将其作为函数()返回。然后我使用 new 运算符将其转换为对象。如何进行单元测试对于这种情况??
-
嗨,我可以通过在 beforeEach 块中使用 new as serviceBMock=new _ServiceB_(); 来解决这个问题的某些部分......但是现在我需要知道如何测试由返回的承诺serviceB.getId......
标签: angularjs unit-testing karma-runner jasmine2.0