MST

星途 面试题库

面试题:复杂类型场景下TypeScript单元测试的类型断言

给定一个接口`User`,包含`name: string`,`age: number`和`email: string`属性。有一个函数`getUser`,它返回一个`Promise<User>`。在单元测试中,如何使用类型断言,确保从`Promise`解析出来的数据符合`User`接口的结构,并且在数据不符合时能正确抛出错误?请用Mocha和Chai框架来实现。
42.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 首先确保你已经安装了mochachai
    npm install mocha chai --save -dev
    
  2. 假设getUser函数在userService.js文件中,代码如下:
    // userService.ts
    export interface User {
        name: string;
        age: number;
        email: string;
    }
    
    export const getUser = (): Promise<User> => {
        // 这里只是模拟,实际应该有真实逻辑
        return Promise.resolve({ name: 'test', age: 18, email: 'test@example.com' });
    };
    
  3. 编写测试用例,在test/userService.test.ts文件中:
    import { expect } from 'chai';
    import { getUser, User } from '../userService';
    
    describe('getUser', () => {
        it('should return data in User interface structure', async () => {
            try {
                const user = await getUser();
                const userAsserted: User = user as User;
                expect(userAsserted.name).to.be.a('string');
                expect(userAsserted.age).to.be.a('number');
                expect(userAsserted.email).to.be.a('string');
            } catch (error) {
                expect.fail('getUser should not reject', error);
            }
        });
    });
    
    在上述代码中:
    • 首先从chai引入expect断言库。
    • userService导入getUser函数和User接口。
    • 使用describeit定义测试用例。
    • 在测试用例中,通过await获取getUser解析出来的数据,然后使用类型断言as User将其断言为User类型。
    • 接着使用expect对解析出来的数据的属性进行类型检查,确保符合User接口定义。如果数据不符合User接口结构,expect会抛出错误,从而使测试失败。

如果在实际项目中,getUser可能会返回rejectedPromise,你可以这样处理:

describe('getUser', () => {
    it('should return data in User interface structure', async () => {
        try {
            const user = await getUser();
            const userAsserted: User = user as User;
            expect(userAsserted.name).to.be.a('string');
            expect(userAsserted.age).to.be.a('number');
            expect(userAsserted.email).to.be.a('string');
        } catch (error) {
            // 如果Promise被rejected,这里可以根据实际情况检查错误类型等
            expect.fail('getUser should not reject', error);
        }
    });

    it('should handle rejection correctly', async () => {
        try {
            await getUser();
            expect.fail('getUser should reject');
        } catch (error) {
            // 这里可以对错误进行断言,比如错误类型等
            expect(error).to.be.an('error');
        }
    });
});