Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用nock记录文件的请求和响应,并在摩卡验收测试中使用它进行回放?_Javascript_Typescript_Mocha.js_Acceptance Testing_Nock - Fatal编程技术网

Javascript 如何使用nock记录文件的请求和响应,并在摩卡验收测试中使用它进行回放?

Javascript 如何使用nock记录文件的请求和响应,并在摩卡验收测试中使用它进行回放?,javascript,typescript,mocha.js,acceptance-testing,nock,Javascript,Typescript,Mocha.js,Acceptance Testing,Nock,我继承了一份工作typescript@2没有测试的项目 它基本上是一个cli任务运行程序,任务多次请求外部api以创建文件。作为第一个故障保护,我想设置验收测试 因此,我想模拟对外部api的调用,并从本地文件获取响应。我如何做到这一点 我已经研究过nock,因为它似乎提供了这个功能,但我该如何使用它呢 (我不提供示例,因为我打算自己回答我的问题,因为我最近刚刚经历了整个考验。)我重构了我的应用程序,当任务对象执行其execute方法时,所有对外部api的调用都会发生。这样的任务实现接口ITask

我继承了一份工作typescript@2没有测试的项目

它基本上是一个cli任务运行程序,任务多次请求外部api以创建文件。作为第一个故障保护,我想设置验收测试

因此,我想模拟对外部api的调用,并从本地文件获取响应。我如何做到这一点

我已经研究过nock,因为它似乎提供了这个功能,但我该如何使用它呢


(我不提供示例,因为我打算自己回答我的问题,因为我最近刚刚经历了整个考验。)

我重构了我的应用程序,当任务对象执行其
execute
方法时,所有对外部api的调用都会发生。这样的任务实现接口
ITask

import {ReadStream} from 'fs';
export interface ITask {
    execute(): Promise<ReadStream>;
}
回放装饰器 然后我可以将其注入appRunner函数:

export async function appRun(config: IConfig, mockMode: MockeMode): Promise<ReadStream> {
    let task: ITask;

    task = new MyTask(config);

    const pathToFile = `tapes/${config.taskName}/tape.json`;
    switch (mockMode) {
        case 'playback':
            console.warn('playback mode!');
            task = new TaskMockPlaybackDecorator(task, path);
            break;
        case 'recording':
            console.warn('recording mode!');
            task = new TaskMockRecorder(task, path);
            break;
        default:
            console.log('normal mode');
    }

    const csvStream = await task.execute();

    return Promise.resolve(csvStream);
}
根据录制的json请求/响应的大小,可能需要通过
timeout
增加运行大小,因为默认值为2秒,此类测试的运行速度可能较慢

mocha --recursive dist/tests -t 10000
这种方法还可以轻松地更新磁带,只需将中的
mockMode
参数作为参数传递,它就会更新
tape.json

缺点是,
tape.json
可能很大,这取决于通信量,但这是有意为之的,因为作为第一步,我想确保我的应用程序在对其代码库进行任何更改时表现相同

export type MockeMode = 'recording'|'playback'|'none';
export async function appRun(config: IConfig, mockMode: MockeMode): Promise<ReadStream> {
    let task: ITask;

    task = new MyTask(config);

    const pathToFile = `tapes/${config.taskName}/tape.json`;
    switch (mockMode) {
        case 'playback':
            console.warn('playback mode!');
            task = new TaskMockPlaybackDecorator(task, path);
            break;
        case 'recording':
            console.warn('recording mode!');
            task = new TaskMockRecorder(task, path);
            break;
        default:
            console.log('normal mode');
    }

    const csvStream = await task.execute();

    return Promise.resolve(csvStream);
}
import nock = require('nock');
import {appRun} from '../../src/core/task/taskRunner';
import {createReadStream} from 'fs';
import {brands} from '../../src/config/BrandConfig';
import isEqual = require('lodash/isEqual');
const streamEqual = require('stream-equal');

describe('myTask', () => {
    const myConfig = { // myConfig // }
    const referencePath = `references/${myConfig.taskName}.csv`;
    it(`generates csv that matches ${referencePath}`, async() => {
        nock.load(`tapes/${config}.taskName}/tape.json`);
        nock.recorder.play();

        return new Promise(async(resolve, reject) => {
            const actual = await appRun(myConfig, 'playback');
            const expected = createReadStream(referencePath);
            streamEqual(actual, expected, (err: any, isEqual: boolean) => {
                if (err) {
                    reject(err);
                }
                if (isEqual) {                          
                    resolve('equals');
                    return;
                }

                reject('not equals');               
            });
        });
    });
});
mocha --recursive dist/tests -t 10000