假设我有以下模块,如 database.js
const initOptions = {}
const pgp = require('pg-promise')(initOptions)
const config = require('../../config')
const db = pgp({
host: config.database.host,
port: config.database.port,
database: config.database.database,
user: config.database.user,
password: config.database.password
})
module.exports = db
以及以下模块作为 create.js
const db = require('./database')
function create (name) {
return new Promise((resolve, reject) => {
db.func('create', name)
.then(data => {
return resolve(data)
})
.catch(err => {
return reject(err)
})
})
}
module.exports = create
我正在尝试在 create.js 上运行单元测试,该测试将测试 db.func 是否以“create”作为第一个参数和“name”作为第二个参数调用,但实际上不需要设置数据库连接(所以测试可以离线运行)。
据我所知,这是可以使用 sinon.JS 之类的库的,所以我尝试创建一个测试并存根 db 对象。
const chai = require('chai')
const chaiAsPromised = require('chai-as-promised')
chai.use(chaiAsPromised)
const sinon = require('sinon')
const expect = chai.expect
const create = require('./create.js')
describe('Test Module', () => {
it('should test stuff', () => {
const db = require('./database')
const dbStub = sinon.stub(db, 'func').callsFake(Promise.resolve(null))
expect(create('test').then).to.be.a('Function')
})
})
但是,它失败了
TypeError: Cannot redefine property: func
很可能是因为我对sinon的接触有限……
如何对 db 函数进行存根(或者我可能需要模拟?),以便我可以测试它以确保调用 db.func ?