单位测试在JavaScript中使用冰棒的异步网络调用



我正在编写一个简单的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)

最新更新