Javascript 续集中的嘲弄

Javascript 续集中的嘲弄,javascript,node.js,unit-testing,jestjs,sequelize.js,Javascript,Node.js,Unit Testing,Jestjs,Sequelize.js,所以我有一个User模型,它属于aUserRole模型。我有一些代码可以执行以下操作: const user = await models.User.create({ email, password: encryptedPassword, ...etc }) await user.setUserRole(role) describe('resolver', () => { Object.assign(models.User.prototype

所以我有一个
User
模型,它
属于
a
UserRole
模型。我有一些代码可以执行以下操作:

 const user = await models.User.create({
    email,
    password: encryptedPassword,
    ...etc
  })

 await user.setUserRole(role)
  describe('resolver', () => {
    Object.assign(models.User.prototype.setUserRole(), jest.fn())

    const userInfo = {
      email: 'name@example.com',
      ...etc
    }

    let mockModel = {
      User: {
        findOne: sinon.stub().resolves(null),
        create: sinon.fake.returns({
          email: 'name@example.com',
          ...etc
        }),
      },
    }
因此,我们创建用户,然后使用自动生成的sequelize函数
setUserRole
将其与角色关联

我想对此进行单元测试,并已完成以下操作:

 const user = await models.User.create({
    email,
    password: encryptedPassword,
    ...etc
  })

 await user.setUserRole(role)
  describe('resolver', () => {
    Object.assign(models.User.prototype.setUserRole(), jest.fn())

    const userInfo = {
      email: 'name@example.com',
      ...etc
    }

    let mockModel = {
      User: {
        findOne: sinon.stub().resolves(null),
        create: sinon.fake.returns({
          email: 'name@example.com',
          ...etc
        }),
      },
    }
然后我运行我的代码,
create
方法工作正常,但当我尝试分配用户角色时,它失败了。我得到这个信息:

TypeError:无法读取未定义的属性“UserRoleId”


因此,我试图模拟Sequelize提供的用于关联两个模型的内置函数,我知道这存在于实例化模型的原型中。那么我哪里出了问题呢?

下面是单元测试解决方案:

index.ts

import{Sequelize,Model,DataTypes,BelongsToSetAssociationMixin}来自'Sequelize';
const sequelize=新的sequelize('postgres://testuser:testpass@localhost:5430/jestjs codelab');
导出类用户扩展模型{
公众id!:号码;
public userRoleId!:编号;
公共电子邮件!:字符串;
公共密码!:字符串;
public readonly createdAt!:日期;
公共只读更新日期!:日期;
public setUserRole!:BelongsToSetAssociationMixin;
}
类UserRole扩展模型{
公众id!:号码;
公共角色!:字符串;
}
User.init(
{
身份证:{
类型:DataTypes.INTEGER,
自动递增:真,
primaryKey:没错,
},
电邮:{
类型:DataTypes.STRING,
allowNull:错,
},
密码:{
类型:DataTypes.STRING,
allowNull:错,
},
},
{
续集,
tableName:'用户',
},
);
UserRole.init(
{
身份证:{
类型:DataTypes.INTEGER,
自动递增:真,
primaryKey:没错,
},
角色:{
类型:DataTypes.STRING,
allowNull:错,
},
},
{sequelize,tableName:'user_roles',时间戳:false},
);
belongsTo(UserRole,{foreignKey:'User\u role\u id'});
//sync({force:true})。然后(async()=>{
//wait UserRole.create({id:'1',role:'admin'});
//const user:any=wait user.create({email:'example@gmail.com,密码:'123',用户角色id:'1'});
//const userRole=wait user.getUserRole();
////console.log(userRole.id);
//console.log('user.user\u role\u id:',user.user\u role\u id.);
// });
导出常量模型={User,UserRole};
导出异步函数createUser(电子邮件:字符串,加密密码:字符串){
const user=wait models.user.create({
电子邮件,
密码:encryptedPassword,
});
const role=wait models.UserRole.create({role:'admin'});
wait user.setUserRole(角色);
}
index.test.ts

从“.”导入{createUser,models};
描述('59650697',()=>{
它('should create user with role',async()=>{
const mUser:any={setUserRole:jest.fn()};
jest.spyOn(models.User,'create').mockResolvedValueOnce(mUser);
const mUserRole:any={id:1,角色:'admin'};
jest.spyOn(models.UserRole,'create').mockResolvedValueOnce(mUserRole);
常数电子邮件example@gmail.com';
const encryptedPassword='123';
等待createUser(电子邮件、加密密码);
expect(models.User.create).toBeCalledWith({email,password:encryptedPassword});
expect(models.UserRole.create).toBeCalledWith({role:'admin});
expect(mUser.setUserRole).toBeCalledWith(mUserRole);
});
});
单元测试结果和覆盖率报告:

通过src/stackoverflow/59650697/index.test.ts(11.948s)
59650697
✓ 应创建具有角色(6ms)的用户
----------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
----------|----------|----------|----------|----------|-------------------|
所有文件| 100 | 100 | 100 | 100 ||
index.ts | 100 | 100 | 100 | 100 ||
----------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:13.797秒,估计15秒
源代码: