Расширение супертеста по машинописи - PullRequest
3 голосов
/ 01 апреля 2020

Я пытаюсь создать расширение для супер-теста.

Используя то, что я нашел в вопросе Расширение 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.

Как предлагается в Расширить Express Объект запроса, используя Typescript , я пытаюсь создать файл для использования функции машинописного текста Декларация слияния .

// 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);
          ~~~~~~~

Вопрос
Есть ли способ исправить это в среде машинописи?

[РЕДАКТИРОВАТЬ]
Дополнительная информация (не обязательно полезная):
В том же проекте у меня есть расширения на express, chai и pdf-merge-js. Все они прекрасно работают, используя подход, описанный выше.

В supertest, возможно, в @types/supertest есть что-то особенное, что мешает ему работать.

Это небольшой фрагмент кода в моем проекте, который уже работает для express:

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

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

1 Ответ

2 голосов
/ 10 апреля 2020

Я не уверен почему, но у меня это сработало:

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" является ключевой частью. Все остальное у тебя есть право.

...