简体   繁体   English

使用 express-session 对 Express 端点进行单元测试

[英]Unit testing Express endpoint with express-session

I've recently tried to write some unit tests for my basic CRUD REST API.我最近尝试为我的基本 CRUD REST API 编写一些单元测试。 Unfortunately, in this API I use Github's OAuth for authentication and express-session for storing sessions.不幸的是,在这个 API 中,我使用 Github 的 OAuth 进行身份验证,并使用 express-session 存储会话。 How do I test this endpoint:如何测试此端点:

export async function createProject(req: Request, res: Response) {
  try {
    const { name, repository_url, repository_provider, assets_path } = req.body;
    const newProject = await Project.create({
      owner_id: (req.user as User).id,
      name,
      repository_url,
      repository_provider,
      assets_path,
    });
    const newMember = await ProjectMember.create({
      project_id: newProject.id,
      member_id: (req.user as User).id,
      project_role: "owner",
    });
    newProject.save();
    newMember.save();
    res.status(201).json(newProject);
  } catch (error) {
    res.status(400).json({ error: error.message || "Unexpected error." });
  }
}

when I don't have req.user set, and I get this by logging into GitHub?当我没有设置req.user时,我通过登录 GitHub 得到这个?

And here's my test suite for now.这是我现在的测试套件。 I use Jest for suites and TypeORM for manipulating the MySQL database.我将 Jest 用于套件,使用 TypeORM 来操作 MySQL 数据库。

let server: Express;
let connection: Connection;

beforeAll(async () => {
  connection = await createConnection();
  server = await createServer();

  await connection.createQueryBuilder().delete().from(User).execute();
  await User.create({
    name: "test",
    github_name: "test",
  }).save();
});

afterAll(async () => {
  await connection.dropDatabase();
  await connection.close();
});

describe("POST /projects", () => {
  it("should return 201 & create project & valid response if not logged in", async (done) => {
    request(server)
      .post("/api/projects")
      .send({
        name: "test",
        repository_url: "https://github.com/test/test",
        repository_provider: "github",
        assets_path: "/assets/i18n"
      })
      .expect("Content-Type", /json/)
      .expect(201)
      .end((err, res) => {
        if (err) return done(err);
        done();
      });
  });
});

As @oozywaters say, first you need to create your application mock.正如@oozywaters 所说,首先您需要创建应用程序模拟。 Then add your session configuration and finally your routes configurations mock.然后添加您的 session 配置,最后添加您的路线配置模拟。 only in this way the variable req.session will not be undefined.只有这样,变量 req.session 才不会未定义。

This is how i implement it:这就是我实现它的方式:

let app: express.Application = express(); 
app.use(express.json());

const options = {
    resave: true,
    saveUninitialized: true,
    secret: Locals.config().appSecret,
    cookie: {
        maxAge: 1209600000
    }
};

app.use(session(options))

app = Routes.mountApi(app);

As you can see is very important that the routes be at the end of all the middleware configurations.如您所见,路由位于所有中间件配置的末尾非常重要。

One possible option is to mock github auth middleware and set req.user manually like this:一种可能的选择是模拟 github auth 中间件并像这样手动设置req.user

// server.js
const createServer = (middleware = []) => {
  const server = express();
  middleware.forEach(item => server.use(item));

  ...
  return server; 
};

// server.test.js
describe("POST /projects", () => {
  let server;
  let middleware = [];

  beforeAll(() => {
    middleware = [
      express.json(),
      (req, res, next) => {
        req.user = { id: 1, name: "Username" };
        next();
      }
    ];
    server = createServer(middleware);
  });

  it("should return 201 ...", async () => { ... });
});

You can also check out an example您还可以查看示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM