gpt4 book ai didi

angular - 单元测试可注入(inject)服务

转载 作者:行者123 更新时间:2023-12-04 02:32:54 29 4
gpt4 key购买 nike

在我的 NX 工作区中执行简单的单元测试时遇到问题。我正在尝试做的是 1)配置 TestBed 和 2)注入(inject)服务。但是,即使我使用脚手架虚拟服务,测试仍然失败,因为注入(inject)的服务据说是 undefined测试服务.ts

import { Injectable } from '@angular/core';

@Injectable({
providedIn: 'root'
})
export class TestService {
constructor() { }
}
test.service.spec.ts
import { TestBed } from '@angular/core/testing';
import { TestService } from './test.service';

describe('TestService', () => {
let service: TestService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [ TestService ]
});
service = TestBed.inject(TestService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});
有人知道为什么会这样吗?这里到底有什么问题?
编辑:
是的,我知道我可以创建一个模拟。但是,这个问题对我来说仍然很奇怪,所以我想深入了解它而不是找到解决方法。
编辑 2:
使用 ng test <project> --test-file=<filename>直接产生相同的结果正在使用 NXCLI 执行测试
编辑 3:我按照要求在 StackBlitz 上分享了我的代码: https://stackblitz.com/edit/ng-unittest-issue

最佳答案

我遇到了完全相同的问题,服务是 undefined被测试的时候。
在这里解决我的问题有两件事:

  • 如果您使用的是 Jest,请确保删除 jest.mock('@angular/core/testing')从你的代码。这是早期版本所必需的。
  • 如果您的服务有任何其他注入(inject),您必须将它们添加到 TestBed.configureTestingModule 下的“提供者”中.

  • 这是一个简单的 Http 服务的示例功能代码和单元测试,在 Angular 9 和 Angular 10 上进行了测试:
    api.service.ts
    import { HttpClient } from '@angular/common/http';
    import { Injectable } from '@angular/core';
    import { Observable } from 'rxjs';

    @Injectable({
    providedIn: 'root',
    })
    export class ApiService {
    constructor(private http: HttpClient) {}
    baseUrl = 'https://my-api-url.com';

    //api/getId/:id
    getDataById(id: number): Observable<DataSample[]> {
    return this.http.get<DataSample[]>(`${this.baseUrl}/getId/${id}`);
    }
    }

    export interface DataSample {
    id: number;
    name: string;
    }

    api.service.spec.ts
    import {
    HttpClientTestingModule,
    HttpTestingController,
    } from '@angular/common/http/testing';
    import { TestBed } from '@angular/core/testing';
    import { ApiService, DataSample } from './api.service';

    describe('ApiService tests', () => {
    let service: ApiService;
    let httpMock: HttpTestingController;

    beforeEach(() => {
    TestBed.configureTestingModule({
    imports: [HttpClientTestingModule],
    providers: [ApiService],
    });
    service = TestBed.inject(ApiService);
    httpMock = TestBed.inject(HttpTestingController);
    });

    afterEach(() => httpMock.verify());

    it('should return an Observable<DataSample[]>', () => {
    expect(service).toBeTruthy();

    const id: number = 1;
    const mockResult: DataSample[] = [
    {
    id: 1,
    name: 'name1',
    },
    {
    id: 2,
    name: 'name2',
    },
    ];
    const expectedUrl = `https://my-api-url.com/getId/${id}`;

    service
    .getDataById(id)
    .subscribe((res) => expect(res).toBe(mockResult));

    const req = httpMock.expectOne(expectedUrl);
    expect(req.request.method).toBe('GET');
    req.flush(mockResult);
    });
    });

    希望对你有帮助😉

    关于angular - 单元测试可注入(inject)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63172146/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com