У меня есть метод автозаполнения jquery, который используется внутри angular2, который вызывает службу для извлечения данных из api. Вот myComponent.ts:
export class myComponent {
private myVar;
private binding1;
private binding2;
constructor( @Inject(ElementRef) private elementRef: ElementRef,private _myService: MyService) {
}
public method1() { return this.myVar.val().toUpperCase(); }
public method2() { return this.myVar.val(""); }
private ngOnInit() {
var _this = this;
this.myVar = $(this.elementRef.nativeElement).children().eq(0).autocomplete({
source: function(request,callback){
_this.mainMethod(request,callback);
},
delay:0,
select: (event, ui) => {
// …},
open: function(e,ui)
{
//…
},
appendTo: $('body')
});
//renderMethod add data to the view using $().append()
public mainMethod (res, callback) { //gets called from inside autocomplete
if(condition 1) {
//renders data from service by calling methodOnService()
//returns binding1 and binding2 which gets rendered in view (see html)
}
else {
//call anotherMethod();
//sets binding1 and binding2 which gets rendered in view (see html)
}
}
public anotherMethod() {
//…
}
myComponent.html:
<input type="text" value="{{binding1}}" size="{{binding2}}" maxlength="94"><span></span>
Мне сложно протестировать код, так как он смешивает angular с jquery (я знаю, что это нехорошо). Но прямо сейчас я хочу вызвать method1, method2, mainMethod, anotherMethod из моего тестового файла, чтобы получить больше покрытия кода.
Файл myComponent.spec.ts:
fit(‘my component test file’,inject([TestComponentBuilder, MyComponent, ElementRef], (tcb:TestComponentBuilder) => {
tcb.createAsync(MyComponent)
.then((fixture) => {
const element = fixture.debugElement.nativeElement;
const instance = fixture.componentInstance;
console.log("component instance", fixture.componentInstance);
fixture.componentInstance.binding2 =12;
fixture.componentInstance.binding1 = 'aapl';
spyOn(instance, "methodOnService");
spyOn(instance,"anotherMethod");
fixture.detectChanges(); //while debugging, it invokes 'ngOnInit' method but doesn't invoke autocomplete method
fixture.componentInstance.symbol= 'aa';
fixture.componentInstance.binding2 =12;
fixture.detectChanges(); //it doesn't even invoke 'ngOnInit'
expect(instance.methodOnService.calls.any()).toEqual(true); //error : Expected false to equal true
expect(instance.anotherMethod).toHaveBeenCalled();
// error :Expected spy anotherMethod to have been called.
Даже для вызова method1 и method2 я не могу издеваться над this.myVar в спецификации? как мне подойти к тестированию различных методов?
this.myVar
высмеивая то, чего вы пытаетесь достичь? - person Günter Zöchbauer   schedule 10.06.2016this.myVar
хранит объект jQuery и при вызовеmethod1
в файле спецификации сообщает, что не может найти.val()
неопределенного значения. так чтоthis.myVar
не издеваются - person candidJ   schedule 10.06.2016method1
в файле спецификации. Под издевательством я имел в виду, что он содержит объект jQuery, возвращенный вngOnInit
. Я обновил свой файл спецификации. Теперь у вас возникла проблема? - person candidJ   schedule 10.06.2016myVar
илиmethod1
. Я не понимаю: - / - person Günter Zöchbauer   schedule 10.06.2016ngOnInit()
не должен вызываться каждымfixture.detectChanges()
.fixture.detectChanges()
- это просто вручную вызвать обнаружение изменений Angulars, которое обычно выполняется автоматически (при любом событии или асинхронном вызове).ngOnInit()
вызывается только один раз после обнаружения первого изменения. Вам нужно будет уничтожить и воссоздать тестовый компонент, чтобыngOnInit()
снова был вызван. - person Günter Zöchbauer   schedule 10.06.2016