2

私はマングースモデルをテストしようとしています。

私はproxyquireを使って統合的にモックしていますが、元のファイルがモデルを登録しているので、

OverwriteModelError: Cannot overwrite `EEG` model once compiled.

必要なものはすべてproxyquireによってすでに注入されているため、モデルをロードしないようにするにはどうすればよいですか?

テストするコード:

var mongoose = require('mongoose');

var db = {},
    Test = require('./model/Test.js'),
    config = require('./config.json');

var dbURL = config.medical.url,
    dbName = config.medical.name;

function connect(callback) {
    db = mongoose.createConnection(dbURL + dbName);
    db.on('error', (err) => {
        callback(err);
    });
    db.once('open', function () {
        callback();
    }); 
}

function save(data, callback) {
    new Test({
        data
    }).save((err) => {
        callback(err);
    });
}

module.exports = {
    connect: connect,
    save: save
}

モデル/Test.js:

var mongoose = require('mongoose');

//Should not get called when proxyquired
module.exports = mongoose.model('Test', mongoose.Schema({
    date: Date,
    data: String
}));

テスト/test.js:

//...
describe('save', (done) => {
    it('Expect to successfully save the Test', (done) => {
        var stub = {
                Test: function Test() {
                    this.save = (callback) => {
                        callback();
                    }
                }
            },
            test = proxyquire('./../test.js', {
                './model/Test.js': stub.Test
            });

        test.save({data: 'data'}, (err) => {
            try {
                expect(err).to.not.be.ok;
                done();
            } catch(err) {
                done(err);
            }
        });
    });

    it('Expect to throw any error raised', (done) => {
        var stub = {
                Test: function Test() {
                    this.save = (callback) => {
                        callback('ERROR');
                    }
                }
            },
            //This line raise a error because Test is already compiled
            test = proxyquire('./../test.js', {
                './model/Test.js': stub.Test
            });

        test.save({data: 'data'}, (err) => {
            try {
                expect(err).to.not.be.ok;
                done();
            } catch(err) {
                done(err);
            }
        });
    });
    //...

私が見つけた別の方法は、テストでマングースをproxyquireし、それをモックして登録を防ぐことですが、それは多くのコードになり、このモデルが4層または5層の深さで呼び出される他のテストがあるため、すべてのレベルでproxyquiring高等関数をモックすることはできますが、本当に面倒です。

4

1 に答える 1

0

回避策を見つけた後に戻ってきます。モデルを外部ファイルに入れ、test/test.js に次のコードを使用しました。

        let stub = {
            mongoose: {
                model: () => {
                    return function Test() {
                        this.save = (callback) => {
                            callback();
                        }
                    }
                },
                Schema: () => {}
            }
        },
        test = proxyquire('./../model/Test.js', {
            'mongoose': stub.mongoose
        }),
        code = proxyquire('./../code.js', {
            'mongoose': mongoose,
            './model/Test.js': test
        });

基本的には、モデルをプロキシクワイアしてマングースをモックし、次にコードをプロキシクワイアして、モックされたモデルを提供します。

于 2016-07-18T14:48:44.557 に答える