开玩笑:无法监视属性,因为它不是函数;执行测试用例时给出未定义的错误而不是出现错误

san*_*ngh 7 javascript node.js jestjs nestjs

           This is my controller class(usercontoller.ts) i am trying to write junit test cases for this class  

            import { UpsertUserDto } from '../shared/interfaces/dto/upsert-user.dto';
            import { UserDto } from '../shared/interfaces/dto/user.dto';
            import { UserService } from './user.service';
                async updateUser(@BodyToClass() user: UpsertUserDto): Promise<UpsertUserDto> {
                    try {
                        if (!user.id) {
                            throw new BadRequestException('User Id is Required');
                        }
                        return await this.userService.updateUser(user);
                    } catch (e) {
                        throw e;
                    }
                } 
Run Code Online (Sandbox Code Playgroud)

这是我的 TestClass(UserContollerspec.ts) 在运行我的测试类时出现错误“无法监视 updateUser 属性,因为它不是函数;而是给定了未定义。出现错误。但是,当我使用间谍On方法时,我不断收到 TypeError: Cannot读取未定义的属性“updateuser”:

*似乎 jest.spyOn() 在我犯错误的地方无法正常工作。有人可以帮助我吗?我正在传递的论点?

    jest.mock('./user.service');

        describe('User Controller', () => {
            let usercontroller: UserController;
            let userservice: UserService;
            // let fireBaseAuthService: FireBaseAuthService;
            beforeEach(async () => {
                const module: TestingModule = await Test.createTestingModule({
                    controllers: [UserController],
                    providers: [UserService]
                }).compile();

                usercontroller = module.get<UserController>(UserController);

                userservice = module.get<UserService>(UserService);
            });

            afterEach(() => {
                jest.resetAllMocks();
            });

         describe('update user', () => {
             it('should return a user', async () => {
               //const result = new  UpsertUserDto();
               const testuser =  new  UpsertUserDto();
               const mockDevice = mock <Promise<UpsertUserDto>>();
               const mockNumberToSatisfyParameters = 0;
               //const userservice =new UserService();
               //let userservice: UserService;
                jest.spyOn(userservice, 'updateUser').mockImplementation(() => mockDevice);
              expect(await usercontroller.updateUser(testuser)).toBe(mockDevice);

          it('should throw internal  error if user not found', async (done) => {
            const expectedResult = undefined;
             ****jest.spyOn(userservice, 'updateUser').mockResolvedValue(expectedResult);****
             await usercontroller.updateUser(testuser)
              .then(() => done.fail('Client controller should return NotFoundException error of 404 but did not'))
              .catch((error) => {
                expect(error.status).toBe(503);
                expect(error.message).toMatchObject({error: 'Not Found', statusCode: 503});  done();
            });
        });
        });
        });
Run Code Online (Sandbox Code Playgroud)

Jay*_*iel 7

您的类很可能UserService具有其他依赖项,因此 Nest 无法实例化该类UserService。当您尝试执行此操作时,userService = module.get(UserService)您会检索到undefined有关 的错误jest.spyOn()。在单元测试中,您应该提供一个模拟提供程序来代替实际提供程序,如下所示:

describe("User Controller", () => {
  let usercontroller: UserController;
  let userservice: UserService;
  // let fireBaseAuthService: FireBaseAuthService;
  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [UserController],
      providers: [
        {
          provide: UserService,
          useValue: {
            updateUser: jest.fn(),
            // other UserService methods
          }
        }
      ],
    }).compile();

    usercontroller = module.get<UserController>(UserController);

    userservice = module.get<UserService>(UserService);
  });
  // rest of tests
});
Run Code Online (Sandbox Code Playgroud)

现在,当您检索时,UserService您将拥有一个具有适当功能的对象,然后可以对其进行jest.spyOn编辑和模拟