【问题标题】:Require export default module in test files需要在测试文件中导出默认模块
【发布时间】:2020-03-16 11:45:18
【问题描述】:

我试图在我的测试文件中要求一个模块,但是当我将它导出为默认模块时,我不知道该怎么做。我有以下代码:

server.ts

import { MyClass } from './myClass';

/* Other code here */

const server = app.listen(port, () => {
    console.log('Started');
});

export default server;

这使用 webpack 构建得非常好。我导出服务器是因为我希望能够在我的规范文件中对其进行测试。我尝试在我的测试文件中这样做(使用 mocha):

testFile.ts

describe('Express Server', () => {
    let server: any;

    beforeEach(() => {
        delete require.cache[require.resolve('./server.ts')];
        server = require('./server.ts');
    });

    afterEach((done: any) => {
        server.close(done);
    });

    it('sample test', (done: any) => {
        done();
    });
});

当然,以上不是测试任何东西。但这没关系,因为它在每个之前都会抛出一个错误:SyntaxError: Unexpected token {

如何要求我的服务器模块?我需要能够在每次测试之前重置需求。

【问题讨论】:

    标签: javascript node.js typescript ecmascript-6 mocha.js


    【解决方案1】:

    结果我不得不更改tsconfig.json 中定义的模块。我将它从“es2015”更改为“commonjs”,问题中发布的错误消失了。此外,我还必须更改检索服务器的方式,如下所示(在要求后添加.default)。

    tsconfig.json

    {
        "compilerOptions": {
            "baseUrl": "./",
            "outDir": "./dist",
            "target": "es5",
            "module": "commonjs", // Had to change the value for this
            "sourceMap": true
        },
        "include": [
            "./src/**/*"
        ],
        "exclude": [
            "./dist",
            "./node_modules"
        ]
    }
    

    testFile.ts

    describe('Express Server', () => {
        let server: any;
    
        beforeEach(() => {
            delete require.cache[require.resolve('./server.ts')];
    
            // Had to change this line to have ".default" at the end
            server = require('./server.ts').default;
        });
    
        afterEach((done: any) => {
            server.close(done);
        });
    
        it('sample test', (done: any) => {
            done();
        });
    });
    

    我没有完全了解“es2015”和“commonjs”之间的区别,所以如果有人知道,请分享。使用上述更改,我能够运行以下命令:

    nyc ts-mocha -p tsconfig.json --reporter mocha-multi-reporters --reporter-options configFile=test/config/mocha-config.json test/**/*.test.ts --exit
    

    它拉入服务器,我的所有测试都通过了,没有任何错误。感谢Freez 提到测试环境可能无法正确读取打字稿。

    【讨论】:

      【解决方案2】:

      您的测试环境似乎不支持 TypeScript 文件。

      尝试使用ts-node运行mocha命令

      mocha -r ts-node/register src/**/test.ts
      

      来源:https://journal.artfuldev.com/write-tests-for-typescript-projects-with-mocha-and-chai-in-typescript-86e053bdb2b6

      【讨论】:

      • 确实如此。我有其他用打字稿编写的测试文件,它们工作正常。这是我运行的命令:nyc ts-mocha -p tsconfig.json --reporter mocha-multi-reporters --reporter-options configFile=test/config/mocha-config.json test/**/*.test.ts --exit
      • 我确实尝试添加 -r ts-node/register 但我得到了同样的错误。
      • delete require.cache[require.resolve('./server.ts')]会发生什么,同样的错误?
      • 是的,同样的错误出现了。由于您的洞察力,我找到了解决方案(发布了答案)。谢谢!
      猜你喜欢
      • 2023-03-09
      • 2020-05-21
      • 2016-12-30
      • 1970-01-01
      • 2018-04-13
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      相关资源
      最近更新 更多