Koa、Express Web单元测试

本文介绍了如何对使用Koa和Express构建的Web应用进行单元测试,重点讲解了jasmine和supertest这两个工具的使用。jasmine用于定义BDD/TDD测试用例,而supertest则可以模拟HTTP请求并验证响应。通过示例展示了从安装到创建异步测试用例的完整流程,以及如何使用supertest与Koa或Express配合进行HTTP请求的测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Koa、Express Web单元测试

标签(空格分隔): koa express test jasmine supertest


通过Koa、express等框架编写的web网站,如何进行单元测试,验证url规则的正确性、router是否能正确处理网络请求等等。简而言之,通过NodeJS搭建了一个web网站,如何验证网站的正确性。
下面我将介绍本文涉及到的两款工具: jasmine和supertest。

jasmine

jasmine是一个款测试工具,类似于mocha,通过它可以定义一些BDD/TDD的单元测试用例。下面我们一个简单的例子来讲述如何使用jasmine。
* Step1, 肯定是安装啦, 通过npm即可安装:

npm install jasmine -g
  • Step2, 切换到你的项目目录,使用内置命令,初始化测试用例:
jasmine init

执行完成之后你将得到类似于下面的文件内容:
|–YouProject
|——…. (其他项目文件)
|——spec
|——|—-support
|——|—-|—-jasmine.json (jasmine配置文件)
打开jasmine.json可以看到jasmine的配置,

{
  "spec_dir": "spec",
  "spec_files": [
    "**/*[sS]pec.js"
  ],
  "helpers": [
    "helpers/**/*.js"
  ],
  "stopSpecOnExpectationFailure": false,
  "random": false
}

由上我们看到, 测试用例的文件只需要按照**/*[sS]pec.js的命名方式即可,如test/FirstSpec.js。
* Step3, 创建测试用例:
File: spec/test/FirstSpec.js

describe("My First Spec", function(){
    // 测试用例
    it("Array.prototype.indexOf", function(){
        let arr = [1, 3, 5];
        expect(arr.indexOf(3)).toBe(1);
        expect(arr.indexOf(7)).toBe(-1);
    });
});

执行测试用例: jasmine
* Step4,如何处理异步测试
很多情况,需要测试的内容是异步的,这时候只需要做一些小的变动即可支持异步测试,如下例:

// ...
    it("Async test case.", function(done){
        setTimeout(() =>{
            console.info("end.");
            done();
        }, 1000);
        console.info("start.");
    });
// ...

跟上例比较,在function中增加了一个done参数,且异步回调时执行done函数。

supertest

supertest是一款http的测试工具,可以用它来模拟http请求,并验证http请求的返回值。它最大的亮点是可以跟koa、express等框架无缝衔接。
通过npm install supertest --save-dev即可安装。下面列举一个简单的koa/express测试样例。

var koa = require("koa");
var express = require("express");
var request = require("supertest");

describe("Http test.", function(){
    it("Koa http", function(done){
        var app = new koa();
        app.use(async function(ctx, next){
            ctx.status = 200;
            ctx.body = "Hello";
            await next();
        });
        return request(app.listen())
            .get("/")
            .expect(200)
            .expect("Hello")
            .end(function(){
                done();
            });
    });

    it("Express http", function(done){
        var app = new Express();
        app.use(function(req, res, next){
            res.send(200, "Hello");
            next();
        });

        return request(app)
            .get("/")
            .expect(200)
            .expect("Hello")
            .end(function(){
                done();
            });
    });
});

有上述例子可以看出,通过supertest测试http请求只需要按照这么几步即可:
1. 调用request方法,并传入实体(String | express instance | koa instance);
2. 设置输入参数,如.query({name: “value”});
3. 设置expect,如.expect(200).expect(“Hello”);
4. 调用end,并传入回调函数。

经过上述步骤,即可完成一个简单的http请求的测试。

Koa单元测试

开发了一个静态文件的middle ware,通过单元测试验证它的功能。
不多说,直接上例子:

var koa = require("koa");
var koa2FileMiddle = require("koa2-file-middle");
var request = require("supertest");
describe("Make a https test.", function(){
    let requestAPI = null;
    beforeAll(function(){
        var k = new koa();
        k.use(koa2FileMiddle(["./spec", "./"], {
            cached: true,
            lastModified:true,
            etag: true,
            debug: false
        }));
        requestAPI = request(k.listen());
    });
    it("Test a file.", function(done){
        return requestAPI.get("/tsconfig.json")
            .set("Accept", "application/json")
            .expect(200)
            .end((err, response) => {
                if(err){
                    throw err;
                }
                console.dir(response.header);
                done();
            });
    });

    it("Test last modified", function(done){
        return requestAPI.get("/tsconfig.json")
            .set("Accept", "application/json")
            .set("If-Modified-Since", "Tue, 12 Sep 2017 10:10:21 GMT")
            .expect(304)
            .end((err, response) => {
                if(err){
                    throw err;
                }
                console.dir(response.header);
                console.info(response.status);
                done();
            });
    });

    it("Test etag", function(done){
        return requestAPI.get("/tsconfig.json")
            .set("Accept", "application/json")
            .set("If-None-Match", 'W/"23b-15e759179e8"')
            .expect(304)
            .end((err, response) => {
                if(err){
                    throw err;
                }
                console.dir(response.header);
                console.info(response.status);
                done();
            });
    });
});

基本思路为,本地开启一个http server,然后通过supertest构造一些网络请求,发送到http server,再利用supertest提供的方法,完成对结果的验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值