一歩一歩reactアプリケーション-nodeを構築mocha+supertest+shouldを使用してユニットテストを書く
5557 ワード
gitアドレス
mochaはnodeユニットテストフレームワークであり、フロントエンドのjasmineに似ており、文法も近い.
supertest nodeインタフェースをテストするためのライブラリ
should nodejs断言ライブラリ、読みやすさが高い
プロジェクトルートディレクトリの下にtestフォルダを新規作成します.movies.spec.js
package.json中
ここでは、映画を追加するインタフェースをテストします.
ここで、ムービー情報はmoviesコレクションに保存され、タイプ情報はtypesコレクションに保存されます.複数のムービーに同じtypeがある場合、同じムービータイプはcollectionに1回しか保存されませんが、inc countフィールドが表示されます.
きほんコード
/routes/movies.js
/models/movies_model.js
/models/type_model.js
テストでは2つの映画情報を入力し、2つのtypeフィールドに同じタイプがあります.
検証する結論:
2本の映画はすべて成功して入力して、typesの集合の中で3本のdocumentがあって、“動作”のcountは2で、もう2本のcountは1です
現在の環境がtestの場合、テストデータベースを使用します.
テストデータ
テストコード
各インタフェースの詳細なテストはtestを参照してください.
mochaはnodeユニットテストフレームワークであり、フロントエンドのjasmineに似ており、文法も近い.
supertest nodeインタフェースをテストするためのライブラリ
should nodejs断言ライブラリ、読みやすさが高い
ビルド
npm install mocha should supertest --save-dev
プロジェクトルートディレクトリの下にtestフォルダを新規作成します.movies.spec.js
package.json中
"scripts": {
"start": "pm2 start ecosystem.config.js",
"test": "mocha --watch" // test
},
インタフェースの説明
ここでは、映画を追加するインタフェースをテストします.
method: POST
api: /api/movies
document: {
"title": 'movie0',
"thumb": "public/p1075586949.jpg",
"actors": [
" ",
" ",
" "
],
"type": [
" ",
" "
],
"instruct": 'instruct...',
"time": "2010-12-22( )",
}
ここで、ムービー情報はmoviesコレクションに保存され、タイプ情報はtypesコレクションに保存されます.複数のムービーに同じtypeがある場合、同じムービータイプはcollectionに1回しか保存されませんが、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 })
})
}
}
テスト
テストでは2つの映画情報を入力し、2つのtypeフィールドに同じタイプがあります.
検証する結論:
2本の映画はすべて成功して入力して、typesの集合の中で3本のdocumentがあって、“動作”のcountは2で、もう2本のcountは1です
現在の環境がtestの場合、テストデータベースを使用します.
/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)
テストデータ
const movieInfo = {
"title": 'movie0',"thumb": "public/p1075586949.jpg",
"actors": [
" ",
],
"type": [
" ",
" "
],
"instruct": 'instruct...',"time": "2010-12-22( )",
}
const movieInfo1 = {
"title": 'movie1',"thumb": "public/p1075586949.jpg",
"actors": [
" ",
],
"type": [
" ",
" "
],
"instruct": 'instruct...',"time": "2010-12-22( )",
}
テストコード
process.env.NODE_ENV = 'test' // , test, Movies_test ,
const should = require('should')
const request = require('supertest')
const app = require('../app')
describe('Movies Test',()=>{
describe('POST /movies',()=>{
// it
beforeEach(function (done) {
request(app) // node
.post('/api/movies').send(movieInfo).then(() => {
return request(app).post('/api/movies').send(movieInfo1)
}).then(res => {
done()
})
})
// it
afterEach(function (done) {
MoviesModel.remove(() => {
TypeModel.remove(() => {
done()
})
})
})
//
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()
})
})
//
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) //" " count 2
should(res.body.data[1]).have.property('count', 1)
should(res.body.data[2]).have.property('count', 1)
done()
})
})
})
})
各インタフェースの詳細なテストはtestを参照してください.