如何不在 mocha 中重复测试
How not to repeat myself with duplicate tests in mocha
这是我的 test.js 文件,我试图在 duplicateTests
函数中进行一些测试,并在不同的测试文件中使用此函数:
function duplicateTests(user) {
it('nested test 2', done => {
console.log('user in duplicateTests function: ', user)
if (user) {
done()
} else {
done(new Error('Dummy error'))
}
})
}
describe('users', () => {
let user
before(async () => {
user = await models.User.create({
name: 'john',
})
})
describe('TEST THE BEFORE HOOK', () => {
it('test 1', done => {
console.log('user: ', user)
if(user) {
done()
} else {
done(new Error('Dummy error'))
}
})
duplicateTests(user)
})
})
'test 1' 中的日志正确记录了用户:
user: { name: 'john' }
但是 'nested test 2' 中的日志记录了这个:
user in duplicateTests function: undefiend
所以 user
在嵌套测试中是 undefined
并且嵌套测试如您所料失败。
我尝试在我的 'before' 钩子中返回一个承诺,但这并没有解决问题。
感谢您提供的任何帮助。
发生这种情况是因为 duplicateTests()
在 before()
完成之前运行。
describe('users', async () => {
let user
user = await models.User.create({
name: 'john',
})
describe('TEST THE BEFORE HOOK', () => {
it('test 1', done => {
console.log('user: ', user)
if(user) {
done()
} else {
done(new Error('Dummy error'))
}
})
duplicateTests(user)
})
})
或者您可以利用 javascript 的对象引用:
function duplicateTests(context) {
// let user = context.user doesnt work here
// because before() has not run yet.
it('nested test 2', done => {
// reference is collapsed
// we can be sure before() was called because
// it is ran before any tests run
let user = context.user
console.log('user in duplicateTests function: ', user)
if (user) {
done()
} else {
done(new Error('Dummy error'))
}
})
}
describe('users', () => {
let context = {}
before(() => new Promise(async (resolve, reject) => {
try {
context.user = await models.User.create({
name: 'john',
})
resolve()
} catch (err) {
reject(err)
}
}))
describe('TEST THE BEFORE HOOK', () => {
it('test 1', done => {
console.log('user: ', context.user)
if(context.user) {
done()
} else {
done(new Error('Dummy error'))
}
})
// context is passed by reference
duplicateTests(context)
})
})
这是我的 test.js 文件,我试图在 duplicateTests
函数中进行一些测试,并在不同的测试文件中使用此函数:
function duplicateTests(user) {
it('nested test 2', done => {
console.log('user in duplicateTests function: ', user)
if (user) {
done()
} else {
done(new Error('Dummy error'))
}
})
}
describe('users', () => {
let user
before(async () => {
user = await models.User.create({
name: 'john',
})
})
describe('TEST THE BEFORE HOOK', () => {
it('test 1', done => {
console.log('user: ', user)
if(user) {
done()
} else {
done(new Error('Dummy error'))
}
})
duplicateTests(user)
})
})
'test 1' 中的日志正确记录了用户:
user: { name: 'john' }
但是 'nested test 2' 中的日志记录了这个:
user in duplicateTests function: undefiend
所以 user
在嵌套测试中是 undefined
并且嵌套测试如您所料失败。
我尝试在我的 'before' 钩子中返回一个承诺,但这并没有解决问题。
感谢您提供的任何帮助。
发生这种情况是因为 duplicateTests()
在 before()
完成之前运行。
describe('users', async () => {
let user
user = await models.User.create({
name: 'john',
})
describe('TEST THE BEFORE HOOK', () => {
it('test 1', done => {
console.log('user: ', user)
if(user) {
done()
} else {
done(new Error('Dummy error'))
}
})
duplicateTests(user)
})
})
或者您可以利用 javascript 的对象引用:
function duplicateTests(context) {
// let user = context.user doesnt work here
// because before() has not run yet.
it('nested test 2', done => {
// reference is collapsed
// we can be sure before() was called because
// it is ran before any tests run
let user = context.user
console.log('user in duplicateTests function: ', user)
if (user) {
done()
} else {
done(new Error('Dummy error'))
}
})
}
describe('users', () => {
let context = {}
before(() => new Promise(async (resolve, reject) => {
try {
context.user = await models.User.create({
name: 'john',
})
resolve()
} catch (err) {
reject(err)
}
}))
describe('TEST THE BEFORE HOOK', () => {
it('test 1', done => {
console.log('user: ', context.user)
if(context.user) {
done()
} else {
done(new Error('Dummy error'))
}
})
// context is passed by reference
duplicateTests(context)
})
})