0

我正在使用 ngDescribe 测试我的 Angular 应用程序。我不认为ngDescribe 在这里应该是一个太大的问题,因为它只是为我管理依赖注入。我首先开始尝试按照 ngDescribe 文档所说的方式进行测试,在下面的代码中,我将其更改为更直接的方法,以查看是否可以进行任何更改。我正在调用一个依次调用的方法,在$http.post('urlname', data);调试时我可以清楚地看到我的方法一直到达它调用 post() 的位置,但它永远不会继续。因此,我的测试总是超时。

希望我只是有一些简单的错误!这是我的代码。失败的测试是“应该工作”,所有其他的都按预期通过。

另请注意,在测试之前,这是由测试和服务的 babel 处理的。

这是服务,使用时效果很好。我已经删除了它涉及的一些其他变量,但我向您保证这些变量工作正常。在调试测试时,我可以看到等待被击中,但它永远不会继续过去,或者返回。在应用程序中使用时,它完全按预期返回。我认为这与ngmock没有按应有的方式返回有关。

async function apiCall (endPoint, data) {
    if (!endPoint) {
        return false;
    }

    try {
        return data ? await $http.post(`${endPoint}`, data) : await $http.get(`${endPoint}`);
    } catch (error) {
        return false;
    }
}

以下是测试:

ngDescribe({
    name: 'Api Service, apiCall',
    modules: 'api',
    inject: ['apiService', '$httpBackend'],
    tests (deps) {
      let svc;
      beforeEach(() => {
        svc = deps.apiService;
      });
      it('is a function', () => {
        expect(angular.isFunction(svc.apiCall)).toBe(true);
      });
      it('returns a promise', () => {
        const apiCall = svc.apiCall();
        expect(angular.isFunction(apiCall.then)).toBe(true);
      });
      it('requires an endpoint', async () => {
        const apiCall = await svc.apiCall();
        expect(apiCall).toBe(false);
      });
      it('should work', (done) => {
        deps.http.expectPOST('fakeForShouldWork').respond({ success: true });
        const apiCall = svc.apiCall('fakeForShouldWork', {});
        apiCall.then(() => done()).catch(() => done());
        deps.http.flush();
      });
    },
  });

被调用的方法 apiCall 只是一个由它解析的 promise,$http.post().then();如果抛出错误,它也会解析 false。

由于 deps.http.expectPOST 没有失败,我可以看出传出请求已发送。我通过将其更改为 expectGET 来验证这一点,然后我收到一个关于它是 POST 的错误。

我曾尝试将 flush() 方法移动到测试方法的所有不同部分,但似乎没有什么区别。

有什么想法吗?非常感谢你的帮助!

4

0 回答 0