Javascript 如何模拟正在测试的函数中调用的函数?

Javascript 如何模拟正在测试的函数中调用的函数?,javascript,node.js,unit-testing,mongoose,jestjs,Javascript,Node.js,Unit Testing,Mongoose,Jestjs,我有一个寄存器功能,可以将我的用户保存到mongoose DB。在测试时,我不希望用户实际保存到数据库中,因此我希望覆盖mongoose保存方法 我的注册方法如下: async register({firstName, lastName, email, password}){ try { const salt = bcrypt.genSaltSync(10); const hash = bcrypt.hashSync(password, salt);

我有一个寄存器功能,可以将我的用户保存到mongoose DB。在测试时,我不希望用户实际保存到数据库中,因此我希望覆盖mongoose保存方法

我的注册方法如下:

async register({firstName, lastName, email, password}){
    try {
        const salt = bcrypt.genSaltSync(10);
        const hash = bcrypt.hashSync(password, salt);

        return await new UserModel({
            firstName,
            lastName,
            email,
            hash
        }).save()

    }catch (err) {
        console.log(`Unable to register new user: ${err}`)
        throw 'Unable to register new user'
    }
}
所以我想测试一下这个方法。我已经编写了测试,但我不知道如何将模拟函数传递到我的
register()
函数中

import UserConnector from './user'
import sinon from 'sinon'
import mongoose from 'mongoose'
import UserModel from '../../models/user'

describe("User connector", () => {

    it("should register user", () => {

        const expectedUser = {
            firstName: "adsfja",
            lastName: "adsfja",
            email: "adsfja@alsda.com",
            password: "password123"
        }

        var myStub = sinon.stub(UserModel.prototype, 'save').withArgs(expectedUser) // <--- How can I pass this into my userConnector.register() method so that the stub is called instead of the real thing

        const user = new UserConnector().register(expectedUser)

        expect(user).toEqual({
            firstName: "adsfja",
            lastName: "adsfja",
            email: "adsfja@alsda.com"
        })

    })
})
从“./user”导入UserConnector
从“sinon”导入sinon
从“猫鼬”导入猫鼬
从“../../models/user”导入UserModel
描述(“用户连接器”,()=>{
它(“应该注册用户”,()=>{
常数预期值={
名字:“adsfja”,
姓氏:“adsfja”,
电子邮件:“adsfja@alsda.com",
密码:“password123”
}
var myStub=sinon.stub(UserModel.prototype,“save”)。使用args(expectedUser)/根据,实现这一点的方法是使用
callsFake

见下面的例子

import UserConnector from './user'
import sinon from 'sinon'
import mongoose from 'mongoose'
import UserModel from '../../models/user'

describe("User connector", () => {

    it("should register user", async () => {

        const expectedUser = {
            firstName: "adsfja",
            lastName: "adsfja",
            email: "adsfja@alsda.com",
            password: "password123"
        }

        var myStub = sinon
          .stub(UserModel.prototype, 'save')
          .callsFake(() => Promise.resolve(expectedUser))

        const userConnector = new UserConnector();
        // since register is used as async, we should expect it to return a promise
        const user = await userConnector.register(expectedUser)

        expect(user).toEqual({
            firstName: "adsfja",
            lastName: "adsfja",
            email: "adsfja@alsda.com"
        })
        myStub.restore() // don't forget to restore stubbed function

    })
})

希望这有帮助

我想您的函数寄存器不应该硬编码依赖项,因此,您可以创建一个类/闭包(或者不创建,只需将适当的数据传递到函数中)在构造函数/闭包函数中输入依赖项,这样您就可以输入测试依赖项来使用存根函数try
var myStub=sinon.stub(UserModel.prototype,'save')。callsFake(()=>expectedUser)
&让我知道您是怎么做的:)还要注意,寄存器是异步的,所以最好使用
const userConnector=new userConnector();const user=wait userConnector.register(expectedUser)
在这里尝试一下