mongoose Jest测试显示对象可能为“null”错误

gr8qqesn  于 2022-11-13  发布在  Go
关注(0)|答案(3)|浏览(159)

我有一些测试mongoose模型的测试用例。但是在用Jest(typescript代码)运行它们时,我得到了很多运行错误:
错误TS2531:对象可能为“null”。
示例代码(错误在第3行):

const user = await User.findById("id_test");
expect(user).toBeDefined();
expect(user.password).not.toBe("older_password");

是的,我的用户可以是空的,但它可以是一个不精确的测试用例,但肯定不是一个阻塞错误...
我怎样才能让我的测试通过?(要么精确我的测试,要么沉默这种类型的错误,但我不想沉默整个项目的这个错误,我只想沉默测试文件,而不是src文件)。

pw9qyyiw

pw9qyyiw1#

选项1。您可以使用非空Assert运算符来Assertuser不是null
例如:
user.ts

import mongoose from 'mongoose';
const { Schema } = mongoose;

export interface IUser extends mongoose.Document {
  id_test: string;
  password: string;
}

const UserSchema = new Schema({
  id_test: String,
  password: String,
});

const User = mongoose.model<IUser>('User', UserSchema);

export { User };

user.test.ts

import { User } from './user';

describe('65148503', () => {
  it('should pass', async () => {
    const user = await User.findById('id_test');
    expect(user).toBeDefined();
    expect(user!.password).not.toBe('older_password'); 
  });
});

选项2.使用选项1,你将在测试用例中使用大量的!操作符,如果你觉得这很麻烦,你可以用--strictnullchecks: truesrc目录创建tsconfig.json,用--strictnullchecks: falsetest目录创建tsconfig.json.更多信息,请参见--strictnullchecks
例如:
test目录中的tsconfig.json

{
  "extends": "../../../tsconfig.json",
  "compilerOptions": {
    "strictPropertyInitialization": false,
    "strictNullChecks": false
  }
}
7dl7o3gd

7dl7o3gd2#

但你不是在测试吗?别搞复杂了。

import { User } from './user';

describe('65148503', () => {
  it('should pass', async () => {
    const user = await User.findById('id_test');
    // if user is null end the test.
    if (!user) {
      throw new Error("User is null");
    }
    // typescript wont b*ch about that any mow!
    expect(user).toBeDefined();
    expect(user!.password).not.toBe('older_password'); 
  });
});
sh7euo9m

sh7euo9m3#

我遇到了同样的问题,但由于no-non-null-assertion也处于活动状态,所以无法像在接受的答案中那样使用非空Assert。
仅对测试禁用这些规则也没有吸引力。
相反,我向我的测试套件中添加了以下函数:

const assertDefined = <T>(obj: T | null | undefined): T => {
  expect(obj).toBeDefined();
  return obj as T;
}

并将测试更新为:

let user = await User.findById("id_test");
user = assertDefined(user);
expect(user.password).not.toBe("older_password");

相关问题