【问题标题】:How to mock lowdb in NestJS如何在 NestJS 中模拟 lowdb
【发布时间】:2022-02-08 12:40:28
【问题描述】:

我正在尝试使用 lowdb 模拟我的数据访问对象。但我不确定如何根据我的实现来模拟集合。

AuthDao.ts

import { Injectable } from "@nestjs/common";
import { User } from "libs/api-interfaces/src/lib/api-interfaces";
import * as low from 'lowdb';
import * as FileSync from 'lowdb/adapters/FileSync';

  export interface MaintenanceRequestDB extends User {
    id: string;
    name: string;
  }

  export interface MaintenanceRequestData {
    users: MaintenanceRequestDB[];
  }

  const adapter = new FileSync<MaintenanceRequestDB>('./db/maint-requests.json')
  const db = low(adapter)
  
  db.defaults({ users: [] }).write();

@Injectable()
export class AuthDao {

    private get collection(): any {
            return db.get('users');
    }

    constructor(
    ) {
        //
    }

    async getAdminUsers(user: User): Promise<MaintenanceRequestDB> {
        const { username, password } = user;
        const values = await this.collection.find({
            username, password
    }).value();
        return values;
    }
}

Auth.Dao.Spec.TS

import { Test } from "@nestjs/testing";
import { User } from "libs/api-interfaces/src/lib/api-interfaces";
import { AuthDao } from "./auth.dao";


describe('AuthService', () => {
    let dao: AuthDao;
    beforeAll(async () => {
      const app = await Test.createTestingModule({
        providers: [AuthDao],
      }).compile();
      dao = app.get<AuthDao>(AuthDao);
    });
  
    describe('getData', () => {
      it('should return valid user', async () => {
         
         const result = await dao.getAdminUsers(createUser("johndoe", "123456"));
         expect(result).toEqual({username: 'johndoe'});
      });
    });
  });

  function createUser(username: string, password: string): User {
    return ({
      username: username,
      password: password
    })
}

此外,由于我几乎在每个测试中都使用 createUser 函数,我可以在哪里以及如何重构我的代码以便它可以与其他测试一起使用?

【问题讨论】:

    标签: angular typescript unit-testing nestjs lowdb


    【解决方案1】:

    我添加了两个数据库以防止迭代真实数据库,一个保存要种子的数据,另一个保存种子数据库以用于单元测试。

    import { seedDatabase} from "../../../database";
    beforeAll(async () => {
            seedDatabase();
        });
    

    然后定义database.ts

    const databaseFile = path.join(__dirname, "../db/test-db.json");
    const adapter = new FileSync<MaintenanceRequestDB>(databaseFile);
    const db = low(adapter);
    export const seedDatabase = () => {
        const testSeed = JSON.parse(
          fs.readFileSync(path.join(process.cwd(), "db", "test-db-seed.json"), "utf-8")
        );
      
        // seed database with test data
        db.setState(testSeed).write();
        return;
      };
    

    我以为你需要 spyOn 或 jest 来模拟数据库,我想你只需要再次加载数据库。

    【讨论】:

    • 不幸的是,它仍然使用主数据库而不是仅使用种子
    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 2022-08-24
    • 2021-12-08
    • 2022-01-02
    相关资源
    最近更新 更多