一歩一歩reactアプリケーション-nodeを構築mocha+supertest+shouldを使用してユニットテストを書く

5557 ワード

gitアドレス
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を参照してください.