相关疑难解决方法(0)

在JasmineJS测试中未触发AngularJS Promise回调

问题介绍

我正在尝试对包装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)

javascript jasmine angularjs karma-runner

40
推荐指数
2
解决办法
1万
查看次数

Angular.js承诺在使用业力进行单元测试服务时无法解决

我正在尝试对Angular.js服务进行单元测试,并且需要对从Mock服务返回的promise(使用Jasmine)设置一个期望值.我正在使用业力单元测试框架.相关的代码段如下:

// I can't figure out how to do the equivalent of a $scope.$digest here. 
var loginStatusPromise = FacebookService.getFacebookToken();
loginStatusPromise.then(function(token) {
    expect(false).toBeTruthy(); // If this test passes, there is something going wrong!
    expect(token).not.toBeNull(); // The token should be ValidToken
    expect(token).toBe('ValidToken');
});
Run Code Online (Sandbox Code Playgroud)

完整的单元测试代码可以在这里看到.

问题是promise.then语句在执行业力时永远不会触发.因此,我的期望陈述都没有被执行.在我的控制器测试中,我使用$ scope.$ digest()来解决承诺,但我不清楚在服务测试中如何做到这一点.我认为在服务测试中没有"范围"的概念.

我在这里有错误的结尾吗?我是否需要将$ rootScope注入我的服务测试,然后使用$ digest?或者,还有另一种方式吗?

javascript unit-testing angularjs karma-runner

5
推荐指数
2
解决办法
4646
查看次数