包含put方法的角度服务测试用例

时间:2019-02-12 21:16:34

标签: angular karma-jasmine angular-services

我正在了解有关Jasmin和业力的测试案例。我做了一个角度服务,可以更新数据库中的某些记录。我之前已经创建过测试用例,实际上不是专家,但是从未创建过将更新更新到数据库的方法。

这是我的基本服务,仅一种方法:

import { Injectable } from '@angular/core';
import {HttpClient} from "@angular/common/http";

@Injectable({
  providedIn: 'root'
})
export class WordsService {

  constructor(protected http: HttpClient) {}

  associate(uuid: string, item):any {

    const url = 'update/associate' + uuid;
    this.http.put(url, item).subscribe(response => {
      return response;
    }, error => {
      console.log(error)
    });
  }
}

我的测试看起来像这样。

describe('WordsService', () => {
  let httpMock: HttpTestingController;
  let ordsService: WordsService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [WordsService]
    });
  });

  httpMock = getTestBed().get(HttpClientTestingModule);
  sentimentTuningService = getTestBed().get(SentimentTuningService);

  it('should be updated', inject([SentimentTuningService], async(service: WordsService) => {
    expect(service).toBeTruthy();

    let mockWordId: string = "37945b85-f6a8-45fd-8864-f45f55df8c78";

    let mockData = {
      label: "My Cool label",
      word_config: "c836468f-1fb4-4339-b5a1-ebf72aa1c6a5",
      uuid: "37945b85-f6a8-45fd-8864-f45f55df8c78",
    };

     WordsService.associate(mockWordId, mockData)
      .subscribe(result => {
        expect(result.status).toBe(201);
      });

  }));

});

我不确切知道应该如何伪造/模拟数据库中的更新,实际上,我不知道我是否使用正确的方式。

很明显,我的测试运行出现问题。

enter image description here

您能帮我告诉我如何测试该服务吗?

1 个答案:

答案 0 :(得分:0)

单元测试通常并不意味着要涵盖单元如何与数据库交互,这更是e2e测试(量角器)的领域。单元测试的目的是覆盖“我被赋予了这种能力,我产生了这种能力或以这种方式做出反应”。在此级别上,所有IO都应该被伪造。

有许多重要的资源链接,这些链接建议使用间谍程序和模拟程序。如果您的服务正在调用httpClient,则不应测试来自httpClient的操作IO,而应该测试它如何响应来自httpClient的I或O(如果我这样说的话)。

一个基本的片段(可能需要调整):

// inside of test
const spy = spyOn(httpClient, 'get').and.callThrough();

... call method
expect(spy).toHaveBeenCalled()

// or
const spy = spyOn(httpClient, 'get').and.callThrough();

... call method with <values>
expect(spy).toHaveBeenCalledWith(<values>)