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);
            }
        });
    });
    //...

我发现的另一种方法是在 Test 中代理 mongoose,并对其进行模拟以防止注册,但这将是很多代码,而且我还有其他测试,该模型被称为 4 或 5 层深,因此代理查询每个级别真的很麻烦,而我可以模拟更高的功能。

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 回答