【发布时间】:2017-10-20 18:10:51
【问题描述】:
假设我有以下模块,如 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
很可能是因为我接触诗侬的机会有限……
如何对 db 函数进行存根(或者我可能需要模拟?)以便我可以测试它以确保调用 db.func?
【问题讨论】:
-
该对象的属性
func是不可配置的,这意味着sinon不能用Object.defineProperty替换属性。 -
这也是我通过研究可以得出的结论。但是,我正在寻找是否有任何其他方法可以使用 pg-promise 来做到这一点。不能用 pg-promise 进行离线单元测试是不可能的
标签: node.js mocha.js sinon pg-promise sinon-chai