component = новый componentClass() VS. component = fixture.createInstance: Angular2

Согласно документации по тестированию Angular2, для тестирования компонентов мы должны создать такой объект:

component = fixture.createInstance;

но для модульного тестирования изолятов, например, для сервисов, говорят, что он создает такой экземпляр:

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

Мне не очень понятно, в чем именно заключается разница между этими двумя подходами к созданию экземпляров. Кроме того, я заметил разницу в доступности, используя оба из них. Кто-нибудь имеет четкое представление о разнице между этими двумя?

1 ответ

Решение

Изолированные тесты предназначены для случаев, когда вы хотите проверить только внутреннее поведение класса. Например

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

Вы не могли сделать это в изолированном тесте.

Другие вопросы по тегам