component = new componentClass() VS.组件 = fixture.createInstance: Angular2

component = new componentClass() VS. component = fixture.createInstance: Angular2

根据 Angular2 测试文档,为了测试组件,我们应该像这样创建一个对象:

component = fixture.createInstance;

但是对于隔离单元测试,比如服务,据说要创建一个这样的实例:

component = new componentClass(); //traditional way of creating objects by calling class constructor

我不是很清楚这两种创建实例的方法到底有什么区别。另外,我注意到使用这两种方法的可访问性差异。有谁清楚这两者的区别吗?

隔离测试适用于只想测试 class 的内部行为的情况。例如

class MyComponent {
  doSomething(): string {}
}

let component = new MyComponent();
expect(component.doSomething()).toBe('Hello World');

在这里您将只测试 doSomething 方法的行为。就是这样。

使用隔离测试无法测试 DOM 交互,因为模板永远不会被编译。为此,我们应该让 Angular 创建组件。然后组件将经历它在实际应用程序中经历的实际生命周期

@Component({
  template: `<h1>{{ message }}</h1>
})
class MyComponent {
  message = 'Hello World'
}

let fixture = TestBed.createComponent(MyComponent);
fixture.component.message = 'new message';
fixture.detectedChanges();
expect(fixture.debugElement.query(By.css('h1')).nativeElement.textContent)
  .toBe('new message');

您无法在单独的测试中执行此操作。