单元测试错误:无法在同步测试中调用Promise.then

Pro*_*oxy 33 javascript unit-testing angular

我开始研究单元测试角度2应用程序,但我甚至陷入最简单的例子中.我只是想运行一个简单的测试,看它是否有效,基本上我想要的是比较标题页中的值和测试中的值.

这是我得到的错误,但我没有看到错误的来源,因为一切看起来都与我同步.

错误:错误:无法从同步测试中调用Promise.then.

单元测试:

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');
    });
});
Run Code Online (Sandbox Code Playgroud)

我的组件:

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

yur*_*zui 59

在beforeEach中移动变量初始化

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');
  });

});
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • 这个例子是正确的,但评论没有解决你的问题.compileComponents()是一个读取HTML模板的异步函数,因此它需要异步测试区域(由firstEach中的async()设置).第二个beforeEach保证只在第一个完成后运行(有点不明显,但有帮助).另一种选择是在compileComponents上使用.then(),因为它返回一个promise.请注意,如果您使用webpack(Angular CLI)或某些其他机制来捆绑组件模板,则无需调用compileComponents(). (6认同)

Nat*_*nna 9

I got the same error for a different reason. I put a TestBed.get(Dependency) call within a describe block. The fix was moving it to the it block.

Wrong:

describe('someFunction', () => {
    const dependency = TestBed.get(Dependency); // this was causing the error

    it('should not fail', () => {
        someFunction(dependency);
    });
});
Run Code Online (Sandbox Code Playgroud)

Fixed:

describe('someFunction', () => {
    it('should not fail', () => {
        const dependency = TestBed.get(Dependency); // putting it here fixed the issue
        someFunction(dependency);
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 自 Angular 9.0.0 起,`TestBed.get()` 方法已被弃用,应使用 `TestBed.inject()` 方法。 (2认同)