You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular测试中注入DOCUMENT令牌失败问题求助

Angular测试中DOCUMENT令牌注入失效的解决方法

问题重现

将ClientValueExtractorService中注入Document的方式从自定义字符串令牌'Document'切换为Angular官方的DOCUMENT令牌后,测试时设置mockDocument的cookie值,调用getValues()无法获取到预期结果,测试失败。

解决步骤

1. 确认DOCUMENT的正确导入

确保服务和测试文件中,DOCUMENT都是从@angular/common导入的,这是最容易忽略的关键点:

// 服务和测试文件顶部都需添加该导入
import { DOCUMENT } from '@angular/common';

2. 修正mock对象的类型断言

原mock使用as Document的类型断言不够严谨,因为模拟对象仅包含cookie属性,与真实Document结构差异较大,会导致TypeScript类型处理出现隐性问题,改为as unknown as Document:

mockDocument = {
    cookie: '',
} as unknown as Document;

3. 修正测试断言的预期值

原测试中toStrictEqual()传入空值,而当cookie为'setting some cookie'时,split('; ')返回的是['setting some cookie'],需修正断言逻辑:

expect(service.getValues()).toStrictEqual(['setting some cookie']);

4. 验证TestBed配置的正确性

确保TestBed.configureTestingModule中的provider配置无重复,避免DOCUMENT被意外覆盖:

TestBed.configureTestingModule({
    providers: [
        ClientValueExtractorService,
        { provide: DOCUMENT, useValue: mockDocument },
    ],
});

修改后的完整测试代码

import { TestBed, getTestBed } from '@angular/core/testing';
import { DOCUMENT } from '@angular/common';
import { ClientValueExtractorService } from './client-value-extractor.service';

describe('ClientValueExtractorService', () => {
    let service: ClientValueExtractorService;
    let mockDocument: Document;

    beforeEach(() => {
        mockDocument = {
            cookie: '',
        } as unknown as Document;

        TestBed.configureTestingModule({
            providers: [
                ClientValueExtractorService,
                { provide: DOCUMENT, useValue: mockDocument },
            ],
        });

        service = getTestBed().inject(ClientValueExtractorService);
    });

    it('should give the clientValues', () => {
        mockDocument.cookie = 'setting some cookie';
        expect(service.getValues()).toStrictEqual(['setting some cookie']);
    });
});

内容的提问来源于stack exchange,提问作者U rock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:43:22