我正在测试我的应用程序,需要验证是否使用正确的数据调用了猫鼬模式构造函数。
让我说:
const UserData = new User(user)
console.log(UserData.contructor.args)
我期望user
对象的日志。
数据可能会传递给猫鼬模式的构造函数吗?
有人可以建议我如何使用它吗?
这是我要解决的特定情况。
export const signup = async (req, res, next) => {
try {
//if user object is missing return error
if (!req.body.user)
return next(boom.unauthorized('No user data received.'))
//get user data
const user = req.body.user,
{ auth: { local: { password, password_2 } } } = user
//check if both passwords match
if (password !== password_2)
return next(boom.unauthorized('Passwords do not match.'))
//check if password is valid
if (!Password.validate(password)) {
const errorData = Password.validate(password, { list: true })
return next(boom.notAcceptable('Invalid password.', errorData))
}
//creates new mongo user
const UserData = new User(user)
//sets user password hash
UserData.setPassword(password)
//saves user to database
await UserData.save()
//returns new users authorization data
return res.json({ user: UserData.toAuthJSON() })
} catch(err) {
//if mongo validation error return callback with error
if(err.name === 'ValidationError') {
return next(boom.unauthorized(err.message))
}
// all other server errors
return next(boom.badImplementation('Something went wrong', err))
}
}
以及部分测试:
describe('Success', () => {
it('Should create new instance of User with request data', async () => {
const req = { body },
res = {},
local = { password: '1aaaBB', password_2: '1aaaBB'},
constructorStub = sandbox.stub(User.prototype, 'constructor')
req.body.user.auth.local = {...local}
await signup(req, res, next)
expect(constructorStub.calledOnceWith({...req.body.user})).to.be.true
})
})
编辑:我可以验证使用expect(constructorStub.calledOnce).to.be.true
调用了
只是无法验证传递的数据。
答案 0 :(得分:0)
编辑:聊了一段时间之后,听起来您需要验证您是否正确创建了新用户。
我在这里的建议是创建一个新函数createUserFromRequest
,它将接受request
并返回一个new User
。
然后您可以轻松地测试它的纯功能(没有副作用,只需输入和输出)。
这时,处理程序中的大多数逻辑都在此函数中,因此可能不值得测试处理程序本身,但是您仍然可以这样做,例如通过模拟上面的函数。
示例:
function createUserFromRequest(request) {
//get user data
const user = req.body.user,
{ auth: { local: { password, password_2 } } } = user
//check if both passwords match
if (password !== password_2)
return next(boom.unauthorized('Passwords do not match.'))
//check if password is valid
if (!Password.validate(password)) {
const errorData = Password.validate(password, { list: true })
return next(boom.notAcceptable('Invalid password.', errorData))
}
//creates new mongo user
const UserData = new User(user)
//sets user password hash
UserData.setPassword(password)
return UserData;
}
请注意:存根和嘲笑通常是代码的味道:可能有更好的测试方法,或者可能有必要将代码重构为更易于测试的标志。它们通常指向紧密耦合或混乱的代码。
查看有关该主题的出色文章:https://medium.com/javascript-scene/mocking-is-a-code-smell-944a70c90a6a