问题
html
<ng-template #content let-modal>
<h1>Modal content inside this ng-template #content </h1>
</ng-template>
Button to open model
<button (click)="open(content)" > Open modal </button>
In ts file
import { NgbModal, ModalDismissReasons } from '@ng-bootstrap/ng-bootstrap';
constructor( public modalService: NgbModal) { }
open(content) {
this.modalService.open(content, { ariaLabelledBy: 'modal-basic-title', size: 'lg' }).result.then((result) => {
this.closeResult = `Closed with: ${result}`;
}, (reason) => {
this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});
}
How to do a jasmine test case for this open function.
回答1:
This is how I've tested it in the past...
Assuming the component TS file looks like this:
export class MyComponent {
closeResult: string;
constructor(private _modalService: NgbModal) {}
public openModal(content): void {
this._modalService.open(content, { size: 'lg' }).result.then((result) => {
this.closeResult = `Closed with: ${result}`;
}, (reason) => {
this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});
}
private getDismissReason(reason: any): string {
return `with: ${reason}`;
}
}
You can use the following test class which will test these scenarios:
this._modalService.open
is called with the correct parameters- When the modal is closed,
closeResult
is updated correctly - When the modal is dimissed,
closeResult
is updated correctly
The test class looks like this:
import { TestBed, async, ComponentFixture, tick, fakeAsync } from '@angular/core/testing';
import { NgbModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { MyComponent } from './my.component';
// Mock class for NgbModalRef
export class MockNgbModalRef {
result: Promise<any> = new Promise((resolve, reject) => resolve('x'));
}
describe('MyComponent', () => {
let fixtureUnderTest: ComponentFixture<MyComponent>;
let componentUnderTest: MyComponent;
let modalService: NgbModal;
let mockModalRef: MockNgbModalRef = new MockNgbModalRef();
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
MyComponent
],
imports: [
NgbModule.forRoot()
]
}).compileComponents();
fixtureUnderTest = TestBed.createComponent(MyComponent);
componentUnderTest = fixtureUnderTest.componentInstance;
modalService = TestBed.get(NgbModal);
}));
it('should open modal', () => {
spyOn(modalService, 'open').and.returnValue(mockModalRef);
componentUnderTest.openModal('<xxxx>');
expect(modalService.open).toHaveBeenCalledWith('<xxxx>', { size: 'lg' });
});
// Needs to be async as modal result returned in a promise
it('should update closeResult when modal closed', fakeAsync(() => {
spyOn(modalService, 'open').and.returnValue(mockModalRef);
componentUnderTest.openModal('<xxxx>');
tick();
expect(componentUnderTest.closeResult).toBe('Closed with: x');
}));
// Needs to be async as modal result returned in a promise
it('should update closeResult when modal dismissed', fakeAsync(() => {
spyOn(modalService, 'open').and.returnValue(mockModalRef);
// Override the result returned from the modal so we can test what happens when the modal is dismissed
mockModalRef.result = new Promise((resolve, reject) => reject('y'));
componentUnderTest.openModal('<xxxx>');
tick();
expect(componentUnderTest.closeResult).toBe('Dismissed with: y');
}));
});
来源:https://stackoverflow.com/questions/54437135/how-to-do-jasmine-unit-test-case-for-angular-6-bootstrap-4-modal