为什么 Jest 运行 是打字稿测试文件,然后是编译后的 JS 测试文件?

Why is Jest running the typescript test files and then the compiled JS test files?

当我运行开玩笑的时候,我失败了9次,总共20次失败了11次,但是两个不同的测试文件之间只有10次测试,这里是:

const fs = require('fs');
const assert = require('assert');
import * as jwt from 'jsonwebtoken';
import * as auth from '../services/authentication-service';

const JWT_ERROR_INVALID_SIG = 'invalid signature';


describe('MMD Integration', () => {
  const SERVICE = "knox";
  const SERVICE_ID = "aluna1";
  const badPublicKeyFile = "badkey.pub";

  describe('Service Config is accessible', () => {
    it('should contain data', async (done) => {
      let config: {} | null = null;
      config = await auth.getServiceConfig().catch(err => {
        console.log("caught getServiceConfig error:", err);
        return null;
      });
      if (config != null) {
        assert.include(Object.keys(config), SERVICE);
      } else {
        console.log("Test failed!");
      }
    });
  });

  describe('Public Key', () => {
    describe('is valid', () => {
      it('should decode successfully', async (done) => {
        let config: {} | null = null;
        config = await auth.getServiceConfig().catch(err => {
          console.log("caught getServiceConfig error:", err);
          return null;
        });
        let publicKey: string | null = null;
        if (config) {
          publicKey = await auth.getServicePublicKey(SERVICE, config).catch(err => {
            console.log("caught getServicePublicKey error:", err);
            return null;
          });
          const token = await auth.genJwt(SERVICE);
          if (token == null) {
            console.log("genJwt returned null: stopping test");
            done();
          } else if (!publicKey) {
            console.log("No public key: stopping test");
            done();
          } else {
            jwt.verify(token, publicKey, (err, decoded) => {
              if (err) {
                console.log("WARNING: valid public key failed!", err.message);
              } else if (decoded && Object.keys(decoded).includes('vendor')) {
                assert.include(Object.values(decoded), SERVICE);
              } else {
                console.log("Test failed!");
              }
            });
          }
        }
      });
    });

    describe('is bad', () => {
      const badPublicKey = fs.readFileSync(badPublicKeyFile);
      it('should fail verify', async (done) => {
        const token = await auth.genJwt(SERVICE);
        if (token == null) {
          console.log("genJwt returned null: stopping test");
          done();
        } else {
          jwt.verify(token, badPublicKey, (err: any, decoded: any) => {
            if (err) {
              assert.equal(err.message, JWT_ERROR_INVALID_SIG);
            } else {
              console.log("WARNING: bad public key worked!", decoded);
            }
          });
        }
      });
    });
  });

  describe('Verify Service', () => {
    describe('with valid public key', () => {
      it('should succeed', async (done) => {
        try {
          const token = await auth.genJwt(SERVICE);
          if (token == null) {
            console.log("genJwt returned null: stopping test");
            done();
          } else {
            const result = await auth.verifyService(SERVICE, token).catch(err => {
              console.log("caught verifyService error: stopping test", err);
              throw new Error(err);
            });
            assert.equal(result, "OK");
          }
        } catch (err) {
          assert.equal(err, "OK");
        }
      });
    });

    describe('with mismatch token', () => {
      it('should fail', async (done) => {
        try {
          const result = await auth.verifyService(SERVICE, "xyz").catch(err => {
            console.log("caught verifyService error: stopping test", err);
            done();
          });
        } catch (err) {
          assert.notEqual(err, "OK");
        }
      });
    });
  });

  describe('Service as real MMD', () => {
    it('should fail', async (done) => {
      try {
        const token = await auth.genJwt("mmd");
        if (token == null) {
          console.log("genJwt returned null: stopping test");
          throw new Error('null token');
        } else {
          const result = await auth.verifyService("mmd", token).catch(err => {
            console.log("caught verifyService error:", err);
            throw new Error(err);
          });
        }
      } catch (err) {
        assert.notEqual(err, "OK");
        console.log(err);
      }
    });
  });

});

describe('Get Token from Request Header', () => {
  const someToken = "fake-jwt";
  const headers = {
    'Content-Type': 'application/json'
    , 'Authorization': 'Bearer ' + someToken
    , 'Aluna-Service': 'foobar'
  };
  const badHeaders2 = {
    'Content-Type': 'application/json'
    , 'Authorization': someToken
    , 'Aluna-Service': 'foobar'
  };

  describe('Request header has authorization', () => {
    it('should return token', () => {
      const result = auth.getTokenFromAuth(headers.Authorization);
      assert.equal(result, someToken);
    });
  });

  describe('Request header is missing authorization', () => {
    it('should return null', () => {
      const result = auth.getTokenFromAuth('');
      assert.equal(result, null);
    });
  });

  describe('Authorization is missing Bearer', () => {
    it('should return null', () => {
      const result = auth.getTokenFromAuth(badHeaders2.Authorization);
      assert.equal(result, null);
    });
  });
});


import request from 'supertest';
import { app } from '../app';

it('renders a greeting to screen', () => {
  return request(app).get('/').send({ greeting: 'howdy' }).expect(200);
})

这是我在终端中看到的:

Test Suites: 3 failed, 1 passed, 4 totaload:flatten Completed in 1ms
Tests:       9 failed, 11 passed, 20 total
Snapshots:   0 total
Time:        31.358 s
Ran all test suites.

Watch Usage
 › Press f to run only failed tests.
 › Press o to only run tests related to changed files.
 › Press p to filter by a filename regex pattern.
 › Press t to filter by a test name regex pattern.
 › Press q to quit watch mode.
 › Press Enter to trigger a test run.

ReferenceError: You are trying to `import` a file after the Jest environment has been torn down.

      at Object.getCodec (node_modules/iconv-lite/lib/index.js:65:27)
      at Object.getDecoder (node_modules/iconv-lite/lib/index.js:127:23)
      at getDecoder (node_modules/raw-body/index.js:45:18)
      at readStream (node_modules/raw-body/index.js:180:15)
      at getRawBody (node_modules/raw-body/index.js:108:12)
[2022-03-07T18:40:25.852Z] 1.0.1-dev error: uncaughtException: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "Error: Caught error after test environment was torn down

这个 API 本来是为了与 Jest 一起工作,或者这是安装的原始测试套件,但其他人落后并开始使用他们在他们的机器上全球使用的 Mocha。还有人介意分享为什么测试会通过他们的全球安装的 Mocha 而不是 Jest 吗?

只是想 post 一个没有埋没在评论中的解决方案。

默认情况下,jest 会在您的整个项目中查找任何测试文件。如果您要构建文件或将文件复制到 build/release 目录,则需要执行以下操作之一:

  1. 从构建管道中排除测试文件,或者
  2. 从 jest 中排除构建目录