Unit test Ошибка: не удается вызвать Promise.then из теста синхронизации
Я начал изучать модульное тестирование приложений angular 2, но застрял даже в самых простых примерах. Я просто хочу запустить простой тест, чтобы увидеть, работает ли он вообще. В общем, я хочу сравнить значение с титульного листа с тем, которое в тесте.
Это ошибка, которую я получаю, но я не вижу, откуда исходит ошибка, поскольку все выглядит для меня синхронно.
Ошибка: ошибка: невозможно вызвать Promise.then из теста синхронизации.
Unit тест:
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement, Input} from '@angular/core';
import { ToDoComponent } from './todo.component';
import { FormsModule } from '@angular/forms';
describe(("test input "),() => {
let comp: ToDoComponent;
let fixture: ComponentFixture<ToDoComponent>;
let de: DebugElement;
let el: HTMLElement;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [ ToDoComponent ],
imports: [ FormsModule ]
})
.compileComponents();
});
fixture = TestBed.createComponent(ToDoComponent);
comp = fixture.componentInstance;
de = fixture.debugElement.query(By.css("h1"));
el = de.nativeElement;
it('should display a different test title', () => {
comp.pageTitle = 'Test Title';
fixture.detectChanges();
expect(el.textContent).toBe('Test Title423');
});
});
Мой компонент:
import {Component} from "@angular/core";
import {Note} from "app/note";
@Component({
selector : "toDoArea",
templateUrl : "todo.component.html"
})
export class ToDoComponent{
pageTitle : string = "Test";
noteText : string ="";
noteArray : Note[] = [];
counter : number = 1;
removeCount : number = 1;
addNote() : void {
if (this.noteText.length > 0){
var a = this.noteText;
var n1 : Note = new Note();
n1.noteText = a;
n1.noteId = this.counter;
this.counter = this.counter + 1;
this.noteText = "";
this.noteArray.push(n1);
}
}
removeNote(selectedNote : Note) :void{
this.noteArray.splice(this.noteArray.indexOf(selectedNote),this.removeCount);
}
}
Ответы
Ответ 1
Переместите инициализацию вашей переменной в beforeEach.
Вы не должны получать вещи из TestBed или управлять прибором или компонентом в области describe
. Вы должны делать это только в рамках тестового прогона: внутри beforeEach
/beforeAll
, afterEach
/afterAll
или внутри it
.
describe(("test input "), () => {
let comp: ToDoComponent;
let fixture: ComponentFixture<ToDoComponent>;
let de: DebugElement;
let el: HTMLElement;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ToDoComponent],
imports: [FormsModule]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ToDoComponent);
comp = fixture.componentInstance;
de = fixture.debugElement.query(By.css("h1"));
el = de.nativeElement;
})
it('should display a different test title', () => {
comp.pageTitle = 'Test Title';
fixture.detectChanges();
expect(el.textContent).toBe('Test Title423');
});
});
Смотрите также
Ответ 2
Я получил ту же ошибку по другой причине. Я поместил TestBed.get(Dependency)
в блок describe
. Исправление двигалось его к it
блоку.
Неправильно:
describe('someFunction', () => {
const dependency = TestBed.get(Dependency); // this was causing the error
it('should not fail', () => {
someFunction(dependency);
});
});
Исправлена:
describe('someFunction', () => {
it('should not fail', () => {
const dependency = TestBed.get(Dependency); // putting it here fixed the issue
someFunction(dependency);
});
});