Angular тесты с ошибкой Не удалось выполнить 'send' on 'XMLHttpRequest'

Я пытаюсь проверить свой компонент angular 4.1.0 -

export class CellComponent implements OnInit {
  lines: Observable<Array<ILine>>;
  @Input() dep: string;
  @Input() embedded: boolean;
  @Input() dashboard: boolean;
  constructor(
    public dataService: CellService,
    private route: ActivatedRoute,
    private router: Router, private store: Store<AppStore>) {
  }
}

Однако простой "должен создать" тест выдает эту загадочную ошибку...

NetworkError: не удалось выполнить 'send' on 'XMLHttpRequest': не удалось загрузить 'ng:///DynamicTestModule/module.ngfactory.js'.

поэтому я нашел этот вопрос, который говорит о том, что проблема заключается в том, что у компонента есть параметры @Input)_, которые не установлены, однако, если я изменяю свой тест как так:

  it('should create', inject([CellComponent], (cmp: CellComponent) => {
    cmp.dep = '';
    cmp.embedded = false;
    cmp.dashboard = false;
    expect(cmp).toBeTruthy();
  }));

то я все равно получаю ту же проблему, аналогично, если я удалю аннотации @Input() от компонента, все равно никакой разницы. Как я могу пройти эти тесты?

Ответ 1

Это проблема нового Углового Кли. Запустите тест с помощью --sourcemaps=false и вы получите правильные сообщения об ошибках.

См. Подробности здесь: https://github.com/angular/angular-cli/issues/7296

РЕДАКТИРОВАТЬ:

Сокращение для этого:

ng test -sm=false

С угловым 6 команда:

ng test --source-map=false

Ответ 2

У меня была такая же проблема с использованием angualar cli 6, я использовал этот тег, чтобы получить правильное сообщение об ошибке:

ng test --source-map=false

Может быть, это поможет кому-то :).

Ответ 3

Для моего случая была проблема с макетными данными, и в случае Array я возвращал string из mock.

someApi = fixture.debugElement.injector.get(SomeApi);
spyOn(someApi, 'someMethod')
  .and.returnValue(Observable.of('this is not a string but array'));

Сообщение об ошибке действительно отвлекает и не сообщает фактическую ошибку. Запуск ng test --source=false указал правильную ошибку и строку и помог мне быстро ее исправить.

Многое время, когда вы издеваетесь над данными, является неполным или неправильным.

Ответ 4

Вы можете либо установить свойство input() в значение по умолчанию в component.ts

@Input() tableColumns: Array<any> = [];  
@Input() pageObj: any = '';

ИЛИ ЖЕ

Измените файл component.spec.ts следующим образом,

beforeEach(() => {  
   fixture = TestBed.createComponent(MyComponent);  
   component = fixture.componentInstance;  
   component.tableColumns = [];  
   component.pageObj = '';  
   fixture.detectChanges();  
});

Ответ 5

Как было предложено выше: fooobar.com/questions/107009/... моя проблема была в моем ngOnInit. Я называл прокси-сервер REST-контроллера, созданного магов. Он возвращал null, и я подписывался на этот нуль, который не работает...

Ошибка вернулась:

Failed to load ng:///DynamicTestModule/MockNodeDashboardComponent_Host.ngfactory.js: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

Я исправил проблему, используя ts-mockito: https://github.com/NagRock/ts-mockito

Я добавил код для создания экземпляра mock, например:

import { mock, instance, when } from 'ts-mockito';
import { Observable } from 'rxjs/Observable';
import { Observer } from 'rxjs/Observer';
import { MockScenario } from './vcmts-api-client/model/MockScenario';

const MockVcmtsnodemockresourceApi: VcmtsnodemockresourceApi = mock(VcmtsnodemockresourceApi);
const obs = Observable.create((observer: Observer<MockScenario[]>) => {
  observer.next(new Array<MockScenario>());
  observer.complete();
});
when(MockVcmtsnodemockresourceApi.getMockScenariosUsingGET()).thenReturn(obs);
const instanceMockVcmtsnodemockresourceApi: VcmtsnodemockresourceApi = instance(MockVcmtsnodemockresourceApi);

Затем добавлен экземпляр в массив поставщиков тестов следующим образом:

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      ...
      providers: [
        ...
        { provide: VcmtsnodemockresourceApi, useValue: instanceMockVcmtsnodemockresourceApi },
        ...
      ]        
    }).compileComponents();
  }));

Ответ 6

Это может быть связано с тем, что Chrome скрывает фактическую ошибку теста. В тестовой области будет запутан какой-то макет http factory, который он не может загрузить, и, следовательно, это сообщение об ошибке. Скорее всего, ошибка будет вокруг области ngOnInit, где объект, скажем, ожидает вспомогательные объекты, и они не определены.

Чтобы попытаться дойти до нижней части ошибки, временно переключитесь на PhantomJS, который, кажется, меньше страдает от этих ошибок инициализации, и это, надеюсь, сообщит вам о фактической ошибке. Несколько раз я обнаружил, что объект, ожидаемый при инициализации, не был завершен. IE:

    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;

    component.object = {}
// should be:
    component.object = {"innerObjectThatIsNeeded" : []}

Исправление объекта, разрешенное PhantomJS, а также Chrome для перехода к следующему тесту.

Кроме этого, я не видел решения для удаления проблемы из Chrome. Как всегда пытайтесь принять политику "удалить код, пока ошибка не исчезнет", чтобы пресечь ошибку.

Ответ 7

У меня также была эта ошибка, о которой, по правде говоря, довольно не разговорчив.

Это связано с HTTP-вызовами через мои услуги

Я использую myService.ts с двумя методами

get();
getAll();

Я издеваюсь над этим сервисом: mockMyService.ts

Ошибка была здесь, потому что мой компонент использовал метод getAll(), который я забыл реализовать в mockMyService, поэтому я просто добавил метод:

private mockObjects = [
{
  'id': '1',
  'champ1': 'TECH',
  'champ2': 2,
  'champ3': 'Data bidon'
},
{
  'id': '2',
  'champ1': 'TECH',
  'champ2': 2,
  'champ3': 'Data au pif'
},
{
  'id': '3',
  'champ1': 'FUNC',
  'champ2': 3,
  'champ3': 'Data quelconque'
},
 ];

getAll(): Observable<any> {
  return Observable.of(this.mockObjects);
}

Ошибка исчезла :)

Ответ 8

Для меня это сообщение появляется, когда макет фальшив в моих тестах: обычно вы предоставляете mockService в своих тестовых бутстрапах. Если ваш макет неполный или ложный, то angular вернуть эту глупую ошибку.

Подробнее о моем случае здесь

Ответ 9

В моем случае виновник был observable.timeout(x).retry(y) применен где-то на возвращаемом Observable на уровне класса сервиса, а затем снова в компоненте, который использовал эту службу.

Все работало корректно в браузере до angular -cli 1.4. Затем началось сбой во время тестов Karma (с такой глупой ошибкой). Разумеется, решение должно было убрать эти операторы тайм-аута/повтора.

Ответ 10

Что я буду делать:

Добавьте console.log() s, строку после строки в ngOnint() и узнайте, как далеко она проходит, а затем проверьте строку, с которой она не пройдет.

Пример:

ngOnInit() {
    this.route.paramMap
        .switchMap(params => {
            this.busy = true;
            this.updateErrors(null);

            console.log(params);

            **const id = params.get('id');**
            console.log(id);

            if (id === 'new') {
                this.editMode = true;
                return Observable.of(GroupComponent.newGroup());
            }
            return this.apiService.getGroup(id);
        })
    }

Это было неудачно в моем тесте с той же ошибкой в этом сообщении. Как показано выше, у меня было два console.logs. Сначала кто-то прошел, а второй нет. Итак, я понял, что проблема заключается в строке const id = params.get('id'); и я это исправил.

Надеюсь, это поможет кому-то.

Ответ 11

Я столкнулся с той же проблемой и нашел для нее ответ следующим образом: вы должны установить свои входы для компонента в каждом, и только тогда эта проблема будет решена.

beforeEach(() => {
    fixture = TestBed.createComponent(CellComponent );
    cmp = fixture.debugElement.componentInstance;
    cmp.dep = '';
    cmp.embedded = false;
    cmp.dashboard = false;
    fixture.detectChanges();
});

Это, безусловно, решит вашу проблему.