Угловой 7 + Жасмин - странная проблема освещения в Стамбуле (получил 97 вместо 100%) - PullRequest
1 голос
/ 05 июня 2019

Я страдаю от проблемы с жасмином

, когда я печатаю покрытие с использованием Стамбула, я получил 97% -ное покрытие вместо 100. одна из строк в операторе if помечена краснымне был охвачен), но наверняка, и даже если я отлаживаю его, я вижу, что отладчик идет в этом разделе if.

как это возможно ??

Вы можете увидеть мой комментарий в кодениже, чтобы увидеть, какая строка является "uncovergaed"

, вот мой тест.spec

describe('testService', () => {
  let testBed: TestBed;
  let test: TestService;
  let httpClientMock: jasmine.SpyObj<HttpClient>;
  let loggerMock: jasmine.SpyObj<Logger>;


  beforeEach( async() => {
    httpClientMock = jasmine.createSpyObj('httpClient', ['get']);
    loggerMock = jasmine.createSpyObj('Logger', [
      'debug',
      'error',
      'trace',
      'info',
      'build'
    ]);
    loggerMock.build.and.returnValue(loggerMock);
    testBed = await TestBed.configureTestingModule({
      imports: [],
      declarations: [],
      providers: [
        TestService,
        HttpClient,
        { provide: Logger, useValue: loggerMock },
        { provide: HttpClient, useValue: httpClientMock }
      ]
    }).compileComponents();

  });

  beforeEach(() => {
    service = TestBed.get(TestService);
  });

  it('should create', () => {
    expect(service).toBeTruthy();
  });

  describe('TestService', () => {

    const subject$ = new AsyncSubject<any>();

    let incommingTestServerData: ReturnType<
      typeof getTestServerData
    >;
    let expectedTestResult: Test;
    const defaultsTestValue = new Test();

    beforeEach(() => {
      incommingTestServerData = getTestServerData();

      expectedTestResult = plainToClass(Test, incommingTestServerData);
    });

    // this test should pass the validation
    it('should get test from server', async () => {
      httpClientMock.get.and.returnValue(subject$);

      service.loadTets();
      subject$.next(incommingTestServerData);
      subject$.complete();

      const testRes: Test = await new Promise((resolve, reject) => {
        service.get$.subscribe(value => {
          resolve(value);
        });
      });

      expect(defaultsTestValue).toEqual(testRes);
    });

it('should resolve default value on validation error', async () => {
      // given
      httpClientMock.get.and.returnValue(subject$);
      incommingTestServerData.value = '10' as any; // create error in validation

      // when
      service.loadTest();
      subject$.next(incommingTestServerData);
      subject$.complete();

      // then
      const TestRes: Test = await new Promise((resolve, reject) => {
        service.get$.subscribe(value => {
          resolve(value);
        });
      });

      expect(defaultsTestValue).toEqual(TestRes);
    });

вот мой код, соответствующий сервису:

 get$: Observable<Test>;
 private testSubject = new AsyncSubject<Test>()

  constructor(private readonly http: HttpClient, logger: Logger) {
    this.get$ = this.testSubject.asObservable();
  }

  async validation(obj: Test) {
    const validationResult = await validate(obj);
    // this row the coverage is skipped but the debugger not  
    if (validationResult.length > 0) { 
      throw new Error('error');

    } else {
     //do smth without return
    }
  }

  async loadTest() {
    if (this.flag) {
      return;
    }

    this.flag = true;

    try {
      const testRes = await this.http
        .get<Test>(TestService.apiEndpoint)
        .toPromise();
      const obj = plainToClass(Test, testRes as Object);
      await this.validation(obj);

    } catch (e) {
      this.logger.debug(e.message);
      this.logger.debug('could not fetch test');
    } finally {
      this.testSubject.next(this.test);
      this.testSubject.complete();
    }
  }

1 Ответ

0 голосов
/ 09 июня 2019

исправлено путем создания нового объекта asyncSubject в beforeEach ()

subject = new AsyncSubjecy<any>()

таким образом, я уверен, что каждый тест получит новый предмет и не будет использовать предыдущий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...