代码之家  ›  专栏  ›  技术社区  ›  Hantsy

如何用笑话来嘲笑和刺探猫鼬。在NestJS的提供者中连接

  •  0
  • Hantsy  · 技术社区  · 6 年前

    我定义了一个自定义的特定数据库 Module 通过Mongoose API连接MongoDB。

    完整的代码是 here .

      {
        provide: DATABASE_CONNECTION,
        useFactory: (dbConfig: ConfigType<typeof mongodbConfig>): Connection =>
          createConnection(dbConfig.uri, {
            useNewUrlParser: true,
            useUnifiedTopology: true,
            //see: https://mongoosejs.com/docs/deprecations.html#findandmodify
            useFindAndModify: false
          }),
        inject: [mongodbConfig.KEY],
      },
    
    

    在为这个提供程序编写测试时,我想确认数据库连接是否已定义并监视 connect 方法来验证调用的参数。

    我真的需要手动模拟功能,但有 an issue which is closed suddenly .

    更新: 我试着用 mocked 从…起 ts-jest ,但它不起作用。

    describe('DatabaseProviders(Connectoin)', () => {
      let conn: any;
    
      jest.mock('mongoose', () => {
        return { createConnection: jest.fn() };
      })
    
      beforeEach(() => {
        // provide a mock implementation for the mocked createConnection:
        mocked(createConnection).mockImplementation((uri: any, options: any) => {
          return {} as any
        });
      });
    
      beforeEach(async () => {
        const module: TestingModule = await Test.createTestingModule({
          providers: [...databaseProviders],
        }).compile();
    
        conn = module.get<Connection>(DATABASE_CONNECTION);
      });
    
      afterEach(() => {
        mocked(createConnection).mockClear();
      });
    
      it('DATABASE_CONNECTION should be defined', () => {
        expect(conn).toBeDefined();
      });
    
      it('connect is called', () => {
        expect(conn).toBeDefined();
        expect(mocked(createConnection).mock.calls.length).toBe(1)
      })
    
    });
    

    运行应用程序时,它会抱怨:

    TypeError: utils_1.mocked(...).mockImplementation is not a function
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Hantsy    5 年前

    在研究了一些资源并阅读了Jest文档后,我自己解决了这个问题。

    
    jest.mock('mongoose', () => ({
        createConnection: jest.fn().mockImplementation(
          (uri:any, options:any)=>({} as any)
          ),
        Connection: jest.fn()
      }))
    
    import { ConfigModule } from '@nestjs/config';
    import { Test, TestingModule } from '@nestjs/testing';
    import { Connection, createConnection } from 'mongoose';
    import mongodbConfig from '../config/mongodb.config';
    import { databaseConnectionProviders } from './database-connection.providers';
    import { DATABASE_CONNECTION } from './database.constants';
    
    describe('DatabaseConnectionProviders', () => {
      let conn: any;
    
      beforeEach(async () => {
        const module: TestingModule = await Test.createTestingModule({
          imports: [ConfigModule.forFeature(mongodbConfig)],
          providers: [...databaseConnectionProviders],
        }).compile();
    
        conn = module.get<Connection>(DATABASE_CONNECTION);
      });
    
    
    
      it('DATABASE_CONNECTION should be defined', () => {
        expect(conn).toBeDefined();
      });
    
      it('connect is called', () => {
        //expect(conn).toBeDefined();
        //expect(createConnection).toHaveBeenCalledTimes(1); // it is 2 here. why?
        expect(createConnection).toHaveBeenCalledWith("mongodb://localhost/blog", {
          useNewUrlParser: true,
          useUnifiedTopology: true,
          //see: https://mongoosejs.com/docs/deprecations.html#findandmodify
          useFindAndModify: false
        });
      })
    
    });
    

    检查完整的代码 here .