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

Bra*_*ley 5 javascript unit-testing angularjs karma-runner

我正在尝试对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?或者,还有另一种方式吗?

bit*_*wit 7

我遇到了这个问题并通过简单地$rootScope.$apply()在测试结束时解决了这个问题

根据@mpm的建议,您的FacebookService可能是个问题.你确定它Facebook在单元测试期间不会发生任何http调用吗?你确定resolve已经被推迟了吗?

  • 在`promise.resolved()`之后放置`$ rootScope.$ apply()`帮助了我类似的情况.AngularJS承诺似乎只在`$ digest`循环的下一次迭代中触发,这可能不会在这样的单元测试中自动触发. (2认同)

bha*_*tol 2

假设您正在使用ngFacebook/ngModule在解决方案/想法之前快速说明一下,该项目没有单元测试!您确定要使用该项目吗?

我快速扫描了 Github 上的单元测试,发现缺少以下内容:-

1)模块初始化。ngFacebook 需要它,或者您需要初始化执行相同操作的模块。

beforeEach(module('ngFacebook'));
Run Code Online (Sandbox Code Playgroud)

或者

beforeEach(module('yieldtome'));
Run Code Online (Sandbox Code Playgroud)

2)认真考虑mocking ngFacebook模块

在单元级测试中,您正在模拟的气泡中测试代码,其中外部接口被删除。

否则)尝试添加调用 API,如下所示:-

 $rootScope.$apply(function() {
     this.FacebookService.getFacebookToken().then(function(){
        //your expect code here
     });
    });
 $httpBackend.flush();//mock any anticipated outgoing requests as per [$httpBackend][2]
Run Code Online (Sandbox Code Playgroud)