Ich habe eine einfache Komponente, die zwei Eingabefelder in einem form
Element enthält. Wenn Sie auf die Schaltfläche zum Senden klicken, ruft sie die addUser
-Funktion für die Komponente auf.Angular2 - Unit Testing Form Senden
Component-Vorlage ist unten angegeben:
<div>
<form [formGroup]="signupForm" (submit)="addUser($event)" role="form" class="form-horizontal">
<label>Firstname:</label>
<input type="text" formControlName="firstName">
<label>Lastname:</label>
<input type="text" formControlName="lastName">
<input type="submit" id="btnSubmit" class="btn btn-primary btn-lg" value="Register" />
</form>
</div>
Component Definition unten angegeben:
@Component({
moduleId: module.id,
templateUrl: 'user.component.html'
})
export class UserComponent {
registered = false;
constructor(
private router: Router,
private fb: FormBuilder,
public authService: AuthService) {
this.signupForm = this.fb.group({
'firstName': ['', Validators.required],
'lastName': ['', Validators.required]
});
}
addUser(event: any) {
event.preventDefault();
this.addUserInvoked = true;
......
......
this.authService.register(this.signupForm.value)
.subscribe(
(res: Response) => {
if (res.ok) {
this.registered = true;
}
},
(error: any) => {
this.registered = false;
});
}
}
Es funktioniert gut. Wie auch immer, in meinem Unit-Test, wenn ich versuche, zu testen, wenn Klick auf Submit-Button aufgerufen wird, dann wird der Anruf an die addUser
gemacht. Aber leider wird die addUser
Funktion nicht aufgerufen.
Unten ist mein Beispiel Unit-Test
class RouterStub {
navigateByUrl(url: string) { return url; }
}
let comp: UserComponent;
let fixture: ComponentFixture<UserComponent>;
describe('UserComponent',() => {
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [ UserComponent ],
schemas: [NO_ERRORS_SCHEMA]
});
});
compileAndCreate();
tests();
});
function compileAndCreate() {
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
{ provide: Router, useClass: RouterStub },
{ provide: AuthService, useValue: authServiceStub },
FormBuilder
]
})
.compileComponents().then(() => {
fixture = TestBed.createComponent(UserComponent);
comp = fixture.componentInstance;
});
}));
}
function tests() {
it('should call addUser when submitted',() => {
const spy = spyOn(comp, 'addUser');
//*************below method doesn't work and it refreshes the page***************
//let btnSubmit = fixture.debugElement.query(By.css('#btnSubmit'));
//btnSubmit.nativeElement.click();
let form = fixture.debugElement.query(By.css('form'));
form.triggerEventHandler('submit', null);
fixture.detectChanges();
expect(comp.addUser).toHaveBeenCalled();
expect(authServiceStub.register).toHaveBeenCalled();
expect(comp.registered).toBeTruthy('user registered');
});
}
Ich habe versucht
fixture.debugElement.query(By.css('#btnSubmit')).nativeElement.click()
und
fixture.debugElement.query(By.css('form')).triggerEventHandler('submit', null)
aber ich bin noch nicht addUser
Funktion aufzurufen. Ich habe bereits eine Frage zu SO here gesehen, aber es ist auch nicht hilfreich.
Welcher Schritt schlägt fehl? 'expect (comp.addUserInvoked) .toBeTruthy();' ist eine ungenaue Erwartung, denn wenn Sie nicht die Methode aufrufen, die nie gesetzt wird. – jonrsharpe
Dies ist eine Dummy-Erwartung, nur um zu testen, dass die Funktion on submit aufgerufen wird. –
Aber ist das der, der versagt? Da die Funktion nicht aufgerufen wird, * ist der Spion *, und Sie rufen nicht durch. Könntest du ein [mcve] mit Ausgabe geben? – jonrsharpe