我正在编写一个简单的JavaScript SDK,我正在围绕冰棒请求对象创建一个包装器并编写一个提取方法。看起来像这样。
import request from 'popsicle';
export default function fetchPosts(postsRequest) {
// some validations
const url = 'api/posts';
const postsRequestData = Object.assign({}, balboaRequest, {url});
if (!authPreflightPromise) {
authPreflightPromise = new Promise((resolve, reject) => {
// Disable auth preflight if configured to do so.
if (!postsRequest.enableAuthPreflight) {
resolve();
}
const authPreflightUrl = 'http://somedomain.com/auth?state=hasArgs';
const authPreflightRequestData = Object.assign({}, {method: 'POST'}, {url: authPreflightUrl});
request(authPreflightRequestData)
.then(() => {
resolve();
})
.catch((error) => {
reject(error);
});
});
}
return authPreflightPromise.then(() => {
return request(postsRequestData);
});
}
现在,我想在不进行实际网络调用的情况下进行单元测试。我了解到冰棒正在使用fetch API,所以我想到了使用fetch-mock库并按照他们的示例所示编写了测试,但是它没有捕获网络调用,并且由于网络呼叫失败而导致我的单位测试仍然失败。p>不确定我要在哪里出错。
import fetchPosts from '../../src/fetchPosts.js';
const fetchMock = require('fetch-mock');
describe('tests for fetch posts ', () => {
it('should return the posts returned by the api for valid requests', () => {
// Mock the fetch() global to always return the same value for GET
fetchMock.get('*', {foo: 'bar'});
var fetchPostsPromise = fetchPosts(createValidRequest(username));
return fetchPostsPromise.then((data) => {
console.log(data);
expect(fetchMock.called()).equal(true);
fetchMock.restore();
}).catch((error) => {
console.log(error);
fetchMock.restore();
});
});
});
首先,在您的fetchPosts
中,我没有看到authPreflightPromise
然后,如果要测试异步功能,则应使用done callback
,否则将获得timeout error
;
it('should return the posts returned by the api for valid requests', (done) => {
fetchMock.get('*', {foo: 'bar'});
var fetchPostsPromise = fetchPosts(createValidRequest(username));
return fetchPostsPromise.then((data) => {
console.log(data);
expect(myMock.called()).equal(true);
fetchMock.restore();
// tell mocha this test has finished
done();
}).catch((error) => {
console.log(error);
fetchMock.restore();
done();
});
// don't forget to set timeout, or you may get a timeout error
}).timeout(10000)