摘要:一步一步構(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
摘要:一步一步構(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è)試框架,類...
摘要:線上地址主要從下面幾點(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)題和解決方法...
摘要:線上地址主要從下面幾點(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)題和解決方法...
摘要:一步一步搭建應(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...
摘要:一步一步搭建應(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...
閱讀 3023·2021-11-23 09:51
閱讀 1016·2021-09-26 09:55
閱讀 3972·2021-09-22 14:58
閱讀 1506·2021-09-08 09:35
閱讀 1086·2021-08-26 14:16
閱讀 891·2019-08-23 18:17
閱讀 2073·2019-08-23 16:45
閱讀 710·2019-08-23 15:55