Я пробовал этот SO пост, но это не мой случай.
У меня есть сервис (AnimationService
), который зависит от другого сервиса (AnimationStateService
),У этого AnimationStateService
есть геттер state
, который я хочу высмеять в своем тесте.Итак, мой тест выглядит следующим образом:
animation.service.spec.ts
describe("AnimationService", () => {
let animationService: SpyObj<AnimationService>;
let animationStateService: SpyObj<AnimationStateService>;
beforeEach(() => {
const spyAnimationStateService = createSpyObj("AnimationStateService", ["changeStatus"]);
TestBed.configureTestingModule({
providers: [
AnimationService,
{provide: AnimationStateService, useValue: spyAnimationStateService}
]
});
animationStateService = TestBed.get(AnimationStateService);
animationService = TestBed.get(AnimationService);
});
fit("should call changeStatus if status is AnimationStatus.Stopped", () => {
// Arrange
// animationStateService.status.and.returnValue(AnimationStatus.Stopped); - Doesn't work
// spyOnProperty(animationStateService, "status").and.returnValue(AnimationStatus.Stopped); - Doesn't work
// animationStateService.status = AnimationStatus.Stopped; - Works, but with TSLint error
// Act
animationService.start();
// Assert
expect(animationStateService.changeStatus).toHaveBeenCalled();
});
});
animation-state.service.spec.ts
@Injectable()
export class AnimationStateService {
public get status(): AnimationStatus { return this.state.animation.status; }
...
}
Когда я пытался издеваться над геттером с помощью:
animationStateService.status.and.returnValue(AnimationStatus.Stopped);
или с помощью:
spyOnProperty(animationStateService, "status").and.returnValue(AnimationStatus.Stopped);
Это не сработало.Получатель просто не возвращает значение, которое я установил.
Этот подход работает:
animationStateService.status = AnimationStatus.Stopped;
, но он дает мне ошибку TSLint:
Cannot assign to 'status' because it is a constant or a read-only property.
Так что на данный момент я не знаю, что еще я должен пытаться издеваться над геттером правильно и без ошибок.