扩展打字稿的超级测试

时间:2020-03-31 21:00:07

标签: node.js typescript testing bdd supertest

我正在尝试在supertest上创建扩展。

使用我在问题Extending SuperTest中发现的内容。我在javascript上有这个工作示例:

const request = require('supertest');
const Test = request.Test;

Test.prototype.authenticate = function(user) {
  const {token, xsrfToken} = user.tokens;

  return this
   .set('Authorization', `Bearer ${token}`)
   .set('X-XSRF-TOKEN', xsrfToken);
}

在测试块中,我可以使用:

request(app)
  .post('/user/settings')
  .authenticate(user)
  .send(...)

这很好。现在的问题是在*.test.ts文件中使用扩展名。

根据Extend Express Request object using Typescript中的建议,我尝试创建一个文件以使用打字稿功能Declaration Merging

// file location: ./src/types/supertest

declare namespace supertest {
  export interface Test {
    authenticate(user: any): this; // I didn't put a type on user to simplify here.
  }
}

,还更改了我的tsconfig.json

{
  "compilerOptions": {

    ...

    "typeRoots": ["./src/types"],

    ...

  }
}

但是当我运行npx tsc

$ npx tsc
src/api/user.test.ts:51:8 - error TS2551: Property 'authenticate' does not exist on type 'Test'.

51       .authenticate(user);
          ~~~~~~~

问题
有没有办法在打字稿环境中解决此问题?

[EDIT]
其他信息(不一定有用):
在同一项目中,我在expresschaipdf-merge-js上有扩展名。使用上述方法,它们都可以正常工作。

supertest可能有一些特别之处,可能是@types/supertest阻止了它工作。

这是我项目中已经可以使用的一些代码:

// file location: ./src/types/express
import { ModelBase } from '../../models/base';

declare global {
  namespace Express {
    export interface Response {
      model: (model: ModelBase) => this;
    }
  }
}

3 个答案:

答案 0 :(得分:3)

我不确定为什么,但这对我有用:

declare module "supertest" {
  interface Test extends superagent.SuperAgentRequest {
    authenticate(user: any): this;
  }
}

结构:

index.ts
tsconfig.json
types
  - supertest
    - index.d.ts

我的index.ts

import request from "supertest";
import express from "express";

const app = express();

app.get("/user", function (req, res) {
  res.status(200).json({ name: "john" });
});

request(app)
  .post("/user/settings")
  .authenticate({ tokens: { token: "", xsrfToken: "" } })
  .send();

我的tsconfig.json

{
  "compilerOptions": {
    "outDir": "dist",
    "rootDir": ".",
    "typeRoots": ["./types", "./node_modules/@types"],
    "esModuleInterop": true
  },
  "files": ["./types/supertest/index.d.ts", "index.ts"]
}

我的types/supertest/index.d.ts

import superagent from "superagent";

declare module "supertest" {
  interface Test extends superagent.SuperAgentRequest {
    authenticate(user: any): this;
  }
}

我认为declare module "supertest"是关键部分。其他一切您都做对了。

答案 1 :(得分:0)

这个对我很有效。

首先我导入了类型

npm i -D @types/supertest  

然后我用过

import { agent as request } from "supertest"; 

答案 2 :(得分:-1)

我会解决这个问题,然后将其导入测试文件即可解决

import { agent as request } from "supertest";