http服务错误的angular 6单元测试

http服务错误的angular 6单元测试,angular,unit-testing,jasmine,karma-jasmine,Angular,Unit Testing,Jasmine,Karma Jasmine,我在尝试测试我的一项服务时出错 该服务有一个方法,在服务器上发出POST请求,然后返回数据,是的,我知道为什么POST和not GET 我需要说我不能使用身份验证服务,因为使用我的登录然后我从服务器获取令牌。 由于我无法登录以获取令牌,因此所有请求都无效 如何单元测试HTTP调用而不在服务器上发出请求,只使用模拟服务器响应的本地数据 我的服务就是这个 库存服务 有人能给我解释一下如何对HTTP调用进行单元测试吗 service.getInventoryData().subscribe 以及如何

我在尝试测试我的一项服务时出错

该服务有一个方法,在服务器上发出POST请求,然后返回数据,是的,我知道为什么POST和not GET

我需要说我不能使用身份验证服务,因为使用我的登录然后我从服务器获取令牌。 由于我无法登录以获取令牌,因此所有请求都无效

如何单元测试HTTP调用而不在服务器上发出请求,只使用模拟服务器响应的本地数据

我的服务就是这个

库存服务
  • 有人能给我解释一下如何对HTTP调用进行单元测试吗
    service.getInventoryData().subscribe

  • 以及如何处理认证部分。 身份验证是我所有测试失败的地方

  • 如果我需要使用模拟数据,如何做到这一点,有人能给我举个例子吗

回复应该给我这些数据。
正如评论中所建议的,在进行单元测试时,您不必担心http调用。我希望API响应在服务器端单独测试。在测试服务时,我的任务是验证我的服务是否正确地执行了它应该执行的操作,假设响应可用。如果没有,您可以测试您的服务是否正确处理错误响应)。你可以在网上阅读更多关于它的信息

所以,在这种情况下,我通常会嘲笑我的反应。您可以使用jasmine
spy
来监视服务调用,比如
spy.on(服务,'getInventoryData')。和.returnValues(属于({your json});

或者,如果您觉得有一个非常大的json,请将其存储在本地资源文件夹中,例如:app/test/resources/response1.json`中,然后将其导入到您的规范中,如:


const-response:any=require(“../test/resources/response1.json”);

正如评论中所建议的,在单元测试时,您不必担心您的http调用。我希望API响应在服务器端单独测试。在测试服务时,我的任务是验证我的服务是否正确地执行了它应该执行的操作,假设响应可用。如果没有,您可以测试您的服务是否正确处理错误响应)。你可以在网上阅读更多关于它的信息

所以,在这种情况下,我通常会嘲笑我的反应。您可以使用jasmine
spy
来监视服务调用,比如
spy.on(服务,'getInventoryData')。和.returnValues(属于({your json});

或者,如果您觉得有一个非常大的json,请将其存储在本地资源文件夹中,例如:app/test/resources/response1.json`中,然后将其导入到您的规范中,如:


const-response:any=require(“../test/resources/response1.json”)

从您的测试床配置导入中删除
HttpClientModule
。我已删除此项,@Joey Gough,但它不起作用。我在响应中遇到了相同的错误,它表示我未经授权在服务器上发出任何请求。所有请求必须首先有效,因为我无法登录以从服务器获取令牌,我得到了此er您需要决定它是集成/e2e测试(hit服务器)还是单元测试(模拟响应)。在UT中,不存在这样的问题,因为您可以自己提供所需的任何内容。@Antoniossss正在进行单元测试。您为什么要访问真正的服务器?从您的测试床配置导入中删除
HttpClientModule
。@Joey Gough我已删除此项,但它不起作用。我在响应中也有相同的错误,它说我未经授权进行测试服务器上有ny个请求。所有请求必须首先有效,因为我无法登录以从服务器获取令牌,我会收到此错误。您需要决定-是集成/e2e测试(hit服务器)还是单元测试(模拟响应)。在UT中,不存在这样的问题,因为您可以自己提供所需的任何内容。@Antoniossss正在进行单元测试。您为什么要访问真正的服务器?
  /**
   * GETS THE INVENTORY DATA.
   * @returns Observable of inventory data from the server.
   */
  getInventoryData<T>() {

    const options = { headers: this.getHeaders() };
    const body: AdditionFiltersEntity = this.shared.getAdditionFilters({});
    const url = `${this.shared.baseUrl}/inventory`;

    return this.http.post(url, body, options).pipe(
      tap(val => console.log(`BEFORE MAP: ${val}`)),
      map(res => res.json()),
      catchError(e => this.shared.handleError(e))
    );

  }
import { TestBed, async, inject } from '@angular/core/testing';

// Modules
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HttpModule } from '@angular/http';
import { MatSnackBarModule } from '@angular/material';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { HttpClientModule } from '@angular/common/http';
import { RouterTestingModule } from '@angular/router/testing';

// Services
import { InventoryService } from './inventory.service';
import { HelpersService } from '@app-services/helpers/helpers.service';
import { MediatorService } from '@app-services/mediator/mediator.service';
import { AuthService } from '@app-services/auth/auth.service';
import { StorageService } from '@app-services/storage/storage.service';

// Models
import { InventoryEntity } from '@app-models/inventory';



describe('InventoryService', () => {

  // let service: InventoryService;
  let httpMock: HttpTestingController;
  let auth: AuthService;
  // let user: User;

  beforeEach(() => {

    TestBed.configureTestingModule({
      imports: [ HttpModule, MatSnackBarModule, RouterTestingModule, HttpClientModule,
      HttpClientTestingModule, BrowserAnimationsModule
    ],
      providers: [
        InventoryService, AuthService, HelpersService, MediatorService, StorageService
      ]
    });


    httpMock  = TestBed.get(HttpTestingController);
    auth      = TestBed.get(AuthService);
    localStorage.setItem('store_ids', JSON.stringify([1])); // just set a test id so we gonna get some kind data.

  });


  beforeEach(async(() => {
    TestBed.compileComponents().catch(error => console.error(error));
  }));

  it('should be created', inject([InventoryService], (service: InventoryService) => {
    expect(service).toBeTruthy();
  }));

  // This is where I get the errors
  fit('Should get inventory data', inject([InventoryService], async (service: InventoryService) => {

    await service.getInventoryData().subscribe( (res: InventoryEntity[]) => {

      // get array first element keys.
      const evaluationKeys = ['brand', 'color_code', 'color_tag', 'family', 'frame_size', 'gender', 'provider', 'quantity', 'tag'];
      const keys = Object.keys(res[0]);

      expect(keys).toEqual(evaluationKeys);

    });

  }));


});
[
  {
    'brand': 'brand-1',
    'color_code': '593',
    'color_tag': 'SILVER',
    'family': 'SOL',
    'frame_size': '54x16x140',
    'gender': 'Unisexe',
    'provider': 'hgg',
    'quantity': 82,
    'tag': '44554'
  }, {
    'brand': 'brand-2',
    'color_code': 'MAU1O1',
    'color_tag': 'BLACK',
    'family': 'SOL',
    'frame_size': '54x17x140',
    'gender': 'Unisexe',
    'provider': 'hgg',
    'quantity': 98,
    'tag': '45445'
  }
]