我正在尝试对包装Facebook JavaScript SDK FB对象的AngularJS服务进行单元测试; 但是,测试不起作用,我无法弄清楚原因.此外,当我在浏览器中运行它而不是使用Karma测试运行器运行的JasmineJS单元测试时,服务代码可以正常工作.
我正在通过$q
对象使用Angular promises测试异步方法.我将测试设置为使用Jasmine 1.3.1异步测试方法异步运行,但该waitsFor()
函数永远不会返回true(请参阅下面的测试代码),它只是在5秒后超时.(Karma尚未附带Jasmine 2.0异步测试API).
我认为这可能是因为then()promise 的方法永远不会被触发(我有一个console.log()设置来显示),即使我$scope.$apply()在异步方法返回时调用,让Angular知道它应该运行一个摘要周期并触发then()回调...但我可能是错的.
这是运行测试时出现的错误输出:
Chrome 32.0.1700 (Mac OS X 10.9.1) service Facebook should return false
if user is not logged into Facebook FAILED
timeout: timed out after 5000 msec waiting for something to happen
Chrome 32.0.1700 (Mac OS X 10.9.1):
Executed 6 of 6 (1 FAILED) (5.722 …Run Code Online (Sandbox Code Playgroud) 在我的控制器中,我得到了另一项服务的承诺.我为它添加了一个'then'子句,但是从未调用过'then'.
看到这个plunker:http://plnkr.co/edit/dX0Oz1?p = preview (javascript版)
'fakeLongRunningPromise'创建一个在2秒后自行解决的承诺.
在控制器本身,一旦解决了承诺,我就会向控制台发送一个注释.
我可以说,承诺正在得到解决,因为它将"解决承诺"输出到控制台.为什么不输出"承诺解决"?
想到可能承诺会超出范围,因为控制器会返回?
当谈到angularjs中的$ http承诺时,我遇到了问题.我在我的服务中这样做:( getSomething函数应链接两个promises)
第二个函数使用外部回调函数!
app.service('blubb', function($http, $q) {
var self = this;
this.getSomething = function(uri, data) {
return self.getData(uri).then(function(data2) {
return self.compactData(uri, data2);
});
};
this.getData = function(uri) {
var deferred = $q.defer();
$http.get(uri).success(function(data) {
deferred.resolve(data);
}).error(function() {
deferred.reject();
});
return deferred.promise;
};
this.compactData = function(uri, data) {
var deferred = $q.defer();
/* callback function */
if(!err) {
console.log(compacted);
deferred.resolve(compacted);
} else {
console.log(err);
deferred.reject(err);
}
/* end of function */
return deferred.promise;
};
});
当我在我的控制器中使用该服务时,它不会输出console.log:
blubb.getSomething(uri, input).then(function(data) {
console.log(data) … 我已经选择了一个项目,我正在尝试将一些数据从服务返回到我的控制器.我已经在这里待了大约12个小时,并尝试了不同的方法.它们通常都会产生同样的"缺失数据".
我试过了
$http.get右侧放在控制器内而不使用promises我觉得我现在所拥有的是一个简单的,因为我可以得到它,而我所读到的一切都说这应该有效
这些链接就是从今天开始的.
我认为可能存在$ scope问题,因为过去我已经看到$ scopes在使用多个控制器时没有获取数据,但是该站点只是在index.html中声明一个控制器作为<body ng-app="myApp" ng-controller="BodyCtrl">设置.主app.js使用状态(我认为来自ui-router)就像这样......
.state('app.view', {
url: '/view',
templateUrl: 'views/view.tpl.html',
controller: 'MyCtrl'
})
Run Code Online (Sandbox Code Playgroud)
将控制器连接到不同的页面.此外,该网站还有一些其他控制器从服务中获取数据,我首先将其作为模板查看,然而,数据和返回比我想要的更复杂.但最重要的是,控制器正在访问服务提供的数据.他们都使用$ resource,这就是我从这个问题开始的方式.我坚持使用$ http因为它应该可以工作,而且我希望在我进入"更高级别"的东西之前使用它.另外,我只需要从端点获取GET,所以觉得$ resource太过分了.
服务
.factory('MyService', ['$http', '$q', '$rootScope', function ($http, $q, $rootScope) {
var defer = $q.defer();
var factory = {};
factory.all = function () {
$http({method: 'GET', url: 'http://URLtoJSONEndpoint'}). …Run Code Online (Sandbox Code Playgroud) angularjs angularjs-service angularjs-scope angularjs-controller angularjs-http