成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一步一步搭建react應(yīng)用-node中使用 mocha + supertest + should 來(lái)

chengtao1633 / 3360人閱讀

摘要:一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址是一個(gè)單元測(cè)試框架,類似于前端的語(yǔ)法也相近用來(lái)測(cè)試接口的庫(kù)斷言庫(kù),可讀性很高搭建項(xiàng)目根目錄下新建文件夾,中監(jiān)聽(tīng)文件下的所有文件接口描述這里我們來(lái)測(cè)試一個(gè)添加一條電影的接口河正宇金允石鄭滿植動(dòng)作犯罪

[一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11...

git地址

mocha 是一個(gè)node單元測(cè)試框架,類似于前端的jasmine,語(yǔ)法也相近

supertest 用來(lái)測(cè)試node接口的庫(kù)

should nodejs斷言庫(kù),可讀性很高

搭建

npm install mocha should supertest --save-dev

項(xiàng)目根目錄下新建test文件夾,movies.spec.js

package.json中

"scripts": {
    "start": "pm2 start ecosystem.config.js",
    "test": "mocha --watch" //監(jiān)聽(tīng) test文件下的所有文件
  },

接口描述

這里我們來(lái)測(cè)試一個(gè)添加一條電影的接口

    method: POST
    api:   /api/movies
    document:  {
        "title": "movie0",
        "thumb": "public/p1075586949.jpg",
        "actors": [
            "河正宇",
            "金允石",
            "鄭滿植"
        ],
        "type": [
            "動(dòng)作",
            "犯罪"
        ],
        "instruct": "instruct...",
        "time": "2010-12-22(韓國(guó))",
    }

這里電影信息會(huì)保存到movies集合中,類型信息保存在types集合中
需要注意的是如果多條電影有相同的type,則同一個(gè)電影類型在collection中只存一次,但會(huì)inc count字段

大體代碼

/routes/movies.js

 const MoviesModel = require("../models/movies_model")
 const CONFIG = require("../config/config")

 function callback(err, docs, res, next) {
    if (err) {
        next(err)
        return
    }
    res.json({
        code: CONFIG.ERR_OK,
        data: docs
    })
}

 router.post("/", function (req, res, next) {
    MoviesModel.addMovies(req.body, (err, docs) => {
        callback(err, docs, res, next)
    })
 });

/models/movies_model.js

    const TypeModel = require("./type_model")
    class MoviesModel{

        addMovies(data, callback) {
            const types = data.type
            DB.connect().then((db, err) => {
                TypeModel.addTypes(types, db) //保存分類
                this.insertOne(db, data, callback)
            }).catch(e => {
                callback(e)
            })
        }
    }

/models/type_model.js

 class Type{

    addTypes(typesArr, db) {
            const Types = db.collection("types")
            typesArr.forEach(item => {
                Types.update({
                    "type_name": item
                }, {
                    "$inc": { count: 1 }
                }, { upsert: true })
            })
        }

 }

測(cè)試

測(cè)試中我們錄入兩條電影信息,兩條的type字段中會(huì)有一個(gè)相同的類型

我們要驗(yàn)證的結(jié)論:

兩條電影都成功錄入,types集合中有三條document,"動(dòng)作"的count是2,另兩條count是1

當(dāng)前環(huán)境是test時(shí),使用測(cè)試數(shù)據(jù)庫(kù)

/config/db.js

let db_name="Movies"
if(process.env.NODE_ENV=="test"){
    db_name="Movies_test"
}
const url = f(`mongodb://%s:%s@localhost:3307/${db_name}?authMechanism=%s`, user, pwd, authMechanism)

測(cè)試數(shù)據(jù)

const movieInfo = {
    "title": "movie0","thumb": "public/p1075586949.jpg",
    "actors": [
        "河正宇",
    ],
    "type": [
        "動(dòng)作",
        "犯罪"
    ],
    "instruct": "instruct...","time": "2010-12-22(韓國(guó))",
}
const movieInfo1 = {
    "title": "movie1","thumb": "public/p1075586949.jpg",
    "actors": [
        "河正宇",
    ],
    "type": [
        "動(dòng)作",
        "愛(ài)情"
    ],
    "instruct": "instruct...","time": "2010-12-22(韓國(guó))",
}

測(cè)試代碼

process.env.NODE_ENV = "test" //運(yùn)行時(shí),會(huì)將當(dāng)前環(huán)境設(shè)置為test,連接數(shù)據(jù)庫(kù)時(shí)使用Movies_test庫(kù),如上
const should = require("should")
const request = require("supertest")
const app = require("../app")

describe("Movies Test",()=>{

    describe("POST /movies",()=>{
        //每個(gè)it語(yǔ)句運(yùn)行開(kāi)始之前會(huì)插入數(shù)據(jù)
        beforeEach(function (done) {
            request(app) //啟動(dòng)node服務(wù)
                .post("/api/movies").send(movieInfo).then(() => {
                    return request(app).post("/api/movies").send(movieInfo1)
                }).then(res => {
                    done()
                })
        })

        //每個(gè)it語(yǔ)句運(yùn)行完之后會(huì)清除表數(shù)據(jù)
        afterEach(function (done) {
            MoviesModel.remove(() => {
                TypeModel.remove(() => {
                    done()
                })
            })
       })

        //測(cè)試錄入成功
        it("add movie and get the added movie", function (done) {
            request(app)
                .get("/api/movies")
                .end((er, res) => {
                    should(res.body.data).have.length(2)
                    should(res.body.data[0]).have.property("title", "movie1")
                    done()
                })
        })

        //類型已經(jīng)存在的就不在存了
        it("repeat type not saved,will only increment count", function (done) {
            request(app)
                .get("/api/types")
                .then(res => {
                    should(res.body.data).have.length(3)
                    should(res.body.data[0]).have.property("count", 2) //"動(dòng)作"的count是2
                    should(res.body.data[1]).have.property("count", 1) 
                    should(res.body.data[2]).have.property("count", 1) 
                    done()
                })
        })
    })

})

詳細(xì)完整的對(duì)每個(gè)接口的測(cè)試見(jiàn) test

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88487.html

相關(guān)文章

  • 步一搭建react應(yīng)用-node使用 mocha + supertest + should 來(lái)

    摘要:一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址是一個(gè)單元測(cè)試框架,類似于前端的語(yǔ)法也相近用來(lái)測(cè)試接口的庫(kù)斷言庫(kù),可讀性很高搭建項(xiàng)目根目錄下新建文件夾,中監(jiān)聽(tīng)文件下的所有文件接口描述這里我們來(lái)測(cè)試一個(gè)添加一條電影的接口河正宇金允石鄭滿植動(dòng)作犯罪 [一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11... git地址 mocha 是一個(gè)node單元測(cè)試框架,類...

    dadong 評(píng)論0 收藏0
  • 步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇

    摘要:線上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開(kāi)啟身份認(rèn)證使用來(lái)做基于的用戶身份認(rèn)證中使用來(lái)寫單元測(cè)試部署技術(shù)棧沒(méi)用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開(kāi)啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫一系列文章來(lái)總結(jié)一下前后端用到技術(shù)及遇到的問(wèn)題和解決方法...

    BigTomato 評(píng)論0 收藏0
  • 步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇

    摘要:線上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開(kāi)啟身份認(rèn)證使用來(lái)做基于的用戶身份認(rèn)證中使用來(lái)寫單元測(cè)試部署技術(shù)棧沒(méi)用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開(kāi)啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫一系列文章來(lái)總結(jié)一下前后端用到技術(shù)及遇到的問(wèn)題和解決方法...

    lylwyy2016 評(píng)論0 收藏0
  • 步一搭建react應(yīng)用-前后端初始化

    摘要:一步一步搭建應(yīng)用項(xiàng)目初始化一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址前端初始化目錄結(jié)構(gòu)。。。。。。 一步一步搭建react應(yīng)用-項(xiàng)目初始化 [一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11... git地址 前端初始化 # 目錄結(jié)構(gòu) +----/build + +----/config + +----+/pu...

    fevin 評(píng)論0 收藏0
  • 步一搭建react應(yīng)用-前后端初始化

    摘要:一步一步搭建應(yīng)用項(xiàng)目初始化一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址前端初始化目錄結(jié)構(gòu)。。。。。。 一步一步搭建react應(yīng)用-項(xiàng)目初始化 [一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11... git地址 前端初始化 # 目錄結(jié)構(gòu) +----/build + +----/config + +----+/pu...

    MartinHan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<