Karma Angular Unit测试承诺永远不会被解决

时间:2017-06-13 20:18:48

标签: angularjs unit-testing promise q resolve

我正在努力确保我的单元测试案例涵盖了承诺永远不会得到解决的情况,并且我遇到了一些问题。

代码块胜过千言万语,所以......

const render = Component => {
  ReactDOM.render(
    <MuiThemeProvider muiTheme={Theme}>
      <Router>
        <AppContainer>
            <Provider store={store}>
                <Component/>
            </Provider>
        </AppContainer>
      </Router>
    </MuiThemeProvider>,
    document.getElementById('root')
  )
};

const renderTest = Component => {
  ReactDOM.render(
    <MuiThemeProvider muiTheme={Theme}>
      <Router>
        <Provider store={store}>
            <Component/>
        </Provider>
      </Router>
    </MuiThemeProvider>,
    document.getElementById('root')
  )
};

//render(Root);
renderTest(Root);

// if (module.hot) {
//   module.hot.accept('./containers/root-container/root-container', () => { render(Root) });
// }

这一切都很好,并测试响应是否符合预期,如果承诺被拒绝,也会无法通过测试。

但是,如果承诺永远不会得到解决,那么测试就会通过,我希望它能够失败。我在myService中缓存此请求,如下所示:

it('returns my resource', function() {
    var myUser = {name:'Bob'}
    $httpBackend.expectGET('/myresource').respond(200,myUser);
    myService.getMyUser()
    .then(function(data) {
        expect(data).toEqual(myUser);
    },fail);
});

现在在上面的场景中,如果要从$ http.get中删除“var cachedUser; function getMyUser(forceUpdate) { var deferred = $q.defer(); if (cachedUser && !forceUpdate) { deferred.resolve(cachedUser); } else { $http.get('/myresource') .then(function(data) { cachedUser = data; deferred.resolve(data); },function(error) { deferred.reject(error); }); } return deferred.promise; } ”行,测试仍会通过。这是因为包含期望deferred.resolve(data)的回调函数永远不会运行。但是,测试应该失败,因为删除该行会破坏此功能的目的。

我已经尝试在测试代码中使正面回调成为间谍并期望间谍toHaveBeenCalled,但这似乎在promise解决之前运行并且失败,即使我可以看到间谍的功能通过控制台日志运行。

我也在单元测试中尝试将promise放入变量然后data.toEqual(myUser),但是再次看来这个期望是在promise被解决之前运行的,因此测试在它应该通过时失败。 / p>

请确保在回答之前了解问题,如果我不清楚则发表评论。

1 个答案:

答案 0 :(得分:0)

问题原来是在处理$ httpBackend时,你必须刷新()后端以获取请求。我在每个测试周围的MyPictures块中执行此操作,因此当尝试从测试块中测试承诺的状态时,承诺实际上尚未得到解决。

通过将afterEach()移到单元测试中,返回的promise确实将其状态从0更新为1.

这是最终的单元测试代码:

$httpBackend.flush()