我正在使用 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() 方法移动到测试方法的所有不同部分,但似乎没有什么区别。
有什么想法吗?非常感谢你的帮助!