角度测试用例错误:无法读取未定义的属性serviceUrl

时间:2020-06-05 19:55:18

标签: angular karma-jasmine web-frontend angular-testing servicetestcase

MyService.ts文件 当我们从secp文件serviceURl调用服务时,该服务变得不确定。

.eslintrc.js

Myservice.spec.ts 从此处的规范我们调用服务时,我们无法模拟appconfig.ts返回数据

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
    export class Sendnotificationservice {
      constructor(private http: HttpClient) {} 
      public sendnotification(
        notificationModel: SendnotificationToModel
      ): Observable<any> {
        return this.http.post<any>(
          AppConfig.settings.serviceUrl +
            'api/Sendnotificationservice/sendnotification',
          notificationModel
          //AppConfig.setting.serviceUrl getting cannot read property serviceurl of undefined
        );
      }
    }

AppConfig.ts 无法将返回数据模拟到服务测试用例文件中

import { Injectable, Injector, OnInit } from "@angular/core";
import { HttpClient, HttpResponce } from "@angular/common/http";
import { IAppConfig } from "./app-config.model";
    describe('Sendnotificationservice', () => {
      let service: Sendnotificationservice;
      let httpSpy: HttpTestingController;
      beforeEach(() => {
        TestBed.configureTestingModule({
          imports: [HttpclientTestingModule],
          providers: [Sendnotificationservice],
        });
        service = TestBed.get(Sendnotificationservice);
        service = TestBed.get(HttpTestingController);
      });
      it('it should get mail', () => {
        const test = {
          clientno: '',
          firstName: 'dev',
          lastName: 'som',
          phoneNo: '484758373',
        };
        service.sendnotification(test).subscribe((data) => {
          expect(data).toEqual(false);
        });
      });
    });

1 个答案:

答案 0 :(得分:0)

这不是您应该在单元测试中模拟的方式。现在,您已经在应用程序代码中包含了测试代码,并且还应该测试该测试代码,如果继续这样,您将陷入测试测试代码的无限循环中,以测试测试代码。

更好的方法是同时模拟AppConfig服务:

import appConfig from 'assets/config/config.local.json';

class MockAppConfig {
  static settings: IAppConfig = appConfig as IAppConfig;
}

TestBed.configureTestingModule({
  imports: [HttpclientTestingModule],
  providers: [
    Sendnotificationservice, 
    { provide: AppConfig, useClass: MockAppConfig }
  ],
});

要执行此操作,您可能必须在"resolveJsonModule": true内设置tsconfig.spec.json。考虑到您很可能不再提供此JSON文件,您也可以只导出对象而不是.json文件。这样可以通过代码提示确保事物的安全。

尽管如此,您还没有到那儿,因为您无法测试这样的Observable响应。您将收到一条错误消息,提示您“它没有期望”。有多种解决方法,一个简单的方法就是调用done

it('it should get mail', (done) => {
  const test = {
    clientno: '',
    firstName: 'dev',
    lastName: 'som',
    phoneNo: '484758373',
   };

   service.sendnotification(test).subscribe((data) => {
     expect(data).toEqual(false);
     done(); // here
   });
});

这对我来说还是有点奇怪。您并没有真正测试服务对象,但是您似乎正在测试API响应。该测试应该在调用API的后端进行,或者通过使用Integration / e2e测试来确保API正常工作