我正在使用ngDescribe测试我的Angular应用。我不认为 ngDescribe在这里应该是一个太大的问题,因为它只是为我管理依赖注入。我首先开始尝试按照ngDescribe文档说的方式进行测试,在下面的代码中我将其更改为更直接的方法,看看我是否可以进行任何更改。我正在调用一个方法,反过来调用$http.post('urlname', data);
调试时我可以清楚地看到我的方法一直到它调用post()的地方但是它永远不会继续。因此,我的测试总是超时。
希望我有一些简单的错误!这是我的代码。失败的测试是“应该工作”,所有其他测试都按预期通过。
请注意,在测试之前,babel正在处理这项测试和服务。
这是服务,使用时效果很好。它还有一些我已经删除的其他变量,但我保证这些变量正常工作。在调试测试时,我可以看到await被击中,但它永远不会继续,或者返回。在应用程序中使用时,它会完全按预期返回。我 THINK 这与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只是一个由$http.post().then();
解析的promise。如果抛出错误,它也会解析为false。
由于deps.http.expectPOST没有失败,我可以告诉发送传出请求。我通过将其更改为expectGET来验证这一点,然后我收到一个关于它是POST的错误。
我已经尝试将flush()方法移动到测试方法的所有不同部分,但似乎没有任何区别。
有什么想法?非常感谢你的帮助!