gpt4 book ai didi

javascript - 如何获取传递给 Mongoose 模式构造函数的数据

转载 作者:IT老高 更新时间:2023-10-28 13:30:21 25 4
gpt4 key购买 nike

我正在测试我的应用程序,需要验证是否使用正确的数据调用了 mongoose 架构构造函数。

假设我这样做:

const UserData = new User(user)
console.log(UserData.contructor.args)

我希望 user 对象的日志。可能数据被传递给了 Mongoose 模式的构造函数?

谁能告诉我如何访问它?

这是我试图解决的具体案例。

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.callOnce).to.be.true

调用的

只是无法验证通过的数据。

最佳答案

编辑:经过一段时间的交谈,您需要验证您是否正确创建了新用户。

我的建议是创建一个新函数 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;
}

请注意: stub 和模拟通常是一种代码异味:可能有更好的测试方法,也可能表明需要将代码重构为更易于测试的东西.它们通常指向紧密耦合或困惑的代码。

查看这篇关于该主题的精彩文章:https://medium.com/javascript-scene/mocking-is-a-code-smell-944a70c90a6a

关于javascript - 如何获取传递给 Mongoose 模式构造函数的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52989789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com