Я изучаю 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);
}
}





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