У меня есть служба SmsService
, которая возвращает обещание в методе submit()
в моем компоненте.
В моем компоненте я вызываю метод this.sms.send()
из SmsService и добавляю then()
& catch()
: this.sms.send(this.messageInput).then(....).catch(....)
Утверждение expect(smsSpy.send).toHaveBeenCalledWith(component.messageInput)
работает правильно после вызова this.sms.send()
, однако this.messageInput
не сбрасывается в ноль и это утверждение не выполняется.Что я делаю неправильно?Я не запускаю обнаружение изменений должным образом?
Я пытаюсь написать пару тестов, чтобы гарантировать, что then
и catch
внутри моего компонента будут вызываться в зависимости от обещания, возвращенного моим send()
шпионом.Как бы я это сделал?,
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import {MomentModule} from 'angular2-moment'
import { FormsModule } from '@angular/forms';
import { AngularFirestore } from '@angular/fire/firestore';
import { Observable, of } from "rxjs";
import { ActivatedRoute } from '@angular/router';
import {SmsService} from './sms.service'
//my component
import {
Component,
OnInit,
AfterViewChecked,
ViewChild,
ElementRef,
AfterViewInit
} from "@angular/core";
@Component({
selector: "app-sms",
templateUrl: "./sms.component.pug",
styleUrls: ["./sms.component.scss"]
})
export class SmsComponent {
@ViewChild("scrollMe") private myScrollContainer: ElementRef;
public messageInput;
public list;
public err;
constructor(public sms: SmsService, private route:ActivatedRoute) {
this.list = this.sms.getItems()//this.route.data['value']['messages']
}
submit() {
this.sms
.send(this.messageInput)
.then(res => {
// console.log(res);
this.messageInput = null
})
.catch(err => {
this.err = `Could not send - ${err}`
});
}
}
//my test
describe('SmsComponent', () => {
let component: SmsComponent;
let fixture: ComponentFixture<SmsComponent>;
var afSpy = jasmine.createSpyObj('AngularFirestore', ['collection', 'valueChanges', 'snapshotChanges', 'pipe', 'add']);
var smsSpy = jasmine.createSpyObj('SmsService', ['send', 'then','catch']);
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SmsComponent ],
providers:[
{ provide: SmsService, useValue: smsSpy },
{ provide: AngularFirestore, useValue: afSpy },
{
provide: ActivatedRoute, useValue: {
params: of([{ id: 'test' }])
}
}
],
imports:[MomentModule, FormsModule],
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SmsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('expect err', () => {
smsSpy.send.and.returnValue(Promise.resolve('asdf'));
smsSpy.catch.and.returnValue('caught');
component.messageInput = 'my new message'
component.submit()
fixture.detectChanges();
expect(smsSpy.send).toHaveBeenCalledWith(component.messageInput) //<-- this passes
expect(component.messageInput).toBe(null) //<---- this fails
});
});