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();
});
Это, безусловно, решит вашу проблему.