Почему иногда второй тест выполняется после первого с Angular Jasmine Unit Testing?

Я изучаю Angular Test, и со мной происходит что-то странное. Дело в том, что С ТАКИМ ЖЕ ТОЧНЫМ КОДОМ, когда я делаю ng test, иногда IT-блок вычитания выполняется перед IT-блоком добавления, когда этот должен быть выполнен первым (а иногда это действительно так):

Это код спецификации:

import { CalculatorService } from './calculator.service';
describe ('calculatorService',()=>{

    let calculator:CalculatorService;
    let loggerSpy:any;

    beforeEach(()=>{

        console.info ("calling the beforeEach");

        loggerSpy=jasmine.createSpyObj('LoggerServiceSpy', ['log']);

        calculator= new CalculatorService(loggerSpy);

    });


    it('should add two numbers', ()=>{


        let result=calculator.add(2,2);

        console.info ("add test");

        expect(result).toBe(4);
        expect(loggerSpy.log).toHaveBeenCalledTimes(1);
    });

    it('should substract two numbers', ()=>{




        let result=calculator.subtract(2,2);

        console.info ("substract test");

        expect(result).toBe(0, "unexpected substracion result");
        expect(loggerSpy.log).toHaveBeenCalledTimes(1);

        
    });

});

И это то, что я иногда получаю:

В других случаях я просто убиваю терминал (интегрированный терминал в Visual Studio Code, это вам поможет), снова выполняю ng test, и нормальный поток выполняется... Что я делаю неправильно?

Обновлено: я добавляю код службы калькулятора и регистратора на случай, если это поможет (также я не знаю, почему тест this.logger.log не выводится, когда я делаю ng test, но я думаю, что это другой вопрос

калькулятор-service.ts

import {Injectable} from '@angular/core';
import {LoggerService} from './logger.service';


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


  constructor(private logger: LoggerService) {

  }

  add(n1: number, n2:number) {
    this.logger.log("Addition operation called");

    return n1 + n2;
  }

  subtract(n1: number, n2:number) {
    this.logger.log("Subtraction operation called");
    return n1 - n2;
  }


}

logger-service.ts


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


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

  log(message:string) {
    console.info(message);
  }

}

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причина этого в том, что Jasmine по умолчанию выполняет тесты в случайном порядке. Это можно изменить, установив random: false в файле karma.conf в свойстве jasmine, как показано здесь в README.

Однако это поведение по умолчанию при случайном запуске ваших модульных тестов на самом деле хорошо. Общий принцип написания хороших модульных тестов заключается в том, чтобы писать их таким образом, чтобы они были полностью автономными — это означает, что каждый тест имеет все необходимое для выполнения сам по себе. Если ваши тесты должны выполняться в определенном порядке, чтобы пройти, это обычно означает, что тесты зависят друг от друга, и это считается плохой практикой.

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

Другие вопросы по теме