笑话测试显示对象可能是“空”错误

Posted

技术标签:

【中文标题】笑话测试显示对象可能是“空”错误【英文标题】:Jest tests show Object is possibly 'null' errors 【发布时间】:2021-03-16 19:09:33 【问题描述】:

我有一些测试用例正在测试猫鼬模型。但是在使用 Jest(打字稿代码)运行它们时,我遇到了很多运行错误:

错误 TS2531:对象可能为“空”。

示例代码(错误在第 3 行):

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

是的,我的用户可以为空,但它可能是一个不精确的测试用例,但肯定不是阻塞错误...

我怎样才能让我的测试通过? (是否精确我的测试,是否消除此类错误但我不想为整个项目消除此错误,我只想在测试文件上保持沉默,而不是在 src 文件上)。

【问题讨论】:

【参考方案1】:

选项 1。您可以使用 Non-null assertion operator 断言 user 不是 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,你会在测试用例中使用很多!操作符,如果你觉得很麻烦,你可以为src目录创建tsconfig.json--strictnullchecks: true,创建@ 987654333@ 用于test 目录与--strictnullchecks: false。更多信息,请参阅--strictnullchecks

例如

tsconfig.jsontest 目录中:


  "extends": "../../../tsconfig.json",
  "compilerOptions": 
    "strictPropertyInitialization": false,
    "strictNullChecks": false
  

【讨论】:

【参考方案2】:

但是,你不是在测试吗?不要复杂。

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'); 
  );
);

【讨论】:

在这张票中也提出了:github.com/microsoft/TypeScript/issues/13652

以上是关于笑话测试显示对象可能是“空”错误的主要内容,如果未能解决你的问题,请参考以下文章

运行笑话测试时出现意外的令牌导入错误

更改组件可见性时 Android Studio 空对象引用错误

基本笑话测试接收到`globalObj.setTimeout is not a function`错误

运行笑话测试时无法附加调试器

角度错误 TS2531:对象可能为“空”

对象可能是“空”.ts(2531)