Arj*_*ngh 0 javascript unit-testing typescript karma-jasmine angular
我正在为具有异步服务的组件编写 angular 7 的单元测试用例并收到此错误:
错误:预期的 spy create 已被调用一次。它被调用了 0 次。
这是我的组件:
export class RegistrationComponent implements OnInit {
submitRegistrationForm() {
if (this.profileForm.invalid) {
this.validateAllFields(this.profileForm);
} else {
// send a http request to save this data
this.guestUserService.create(this.profileForm.value).subscribe(
result => {
if (result) {
console.log('result', result);
this.router.navigate(['/login']);
}
},
error => {
console.log('error', error);
});
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试用例:
describe('RegistrationComponent', () => {
let component: RegistrationComponent;
let fixture: ComponentFixture<RegistrationComponent>;
let myService;
let mySpy;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [RegistrationComponent],
imports: [ ],
providers: [
{ provide: GuestUserService, useValue: new MyServiceStub() }]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(RegistrationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should submit Registration Form', async(inject([Router], (router) => {
myService = TestBed.get(GuestUserService);
mySpy = spyOn(myService, 'create');
spyOn(router, 'navigate');
spyOn(component, 'submitRegistrationForm');
component.profileForm.controls['firstName'].setValue('Arjun');
component.profileForm.controls['lastName'].setValue('Singh');
component.profileForm.controls['password'].setValue('12345678');
component.profileForm.controls['confirmPassword'].setValue('12345678');
component.submitRegistrationForm();
expect(component.profileForm.invalid).toBe(false);
expect(component.submitRegistrationForm).toHaveBeenCalled();
expect(myService).toBeDefined();
expect(mySpy).toBeDefined();
expect(mySpy).toHaveBeenCalledTimes(1); // Getting error is this
expect(router.navigate).toHaveBeenCalled();
})
));
Run Code Online (Sandbox Code Playgroud)
我试图在 beforeEach 中移动间谍减速,但仍然给出相同的错误。
如何修复这个错误?
谢谢!
小智 9
预期的 spy create 被调用不是错误而是失败的测试。
发生这种情况是因为您没有使用 callThrough(); 在你的 spyOn 上。
it('should submit Registration Form', async(inject([Router], (router) => {
myService = TestBed.get(GuestUserService);
mySpy = spyOn(myService, 'create').and.callThrough(); //callThrough()
spyOn(router, 'navigate');
spyOn(component, 'submitRegistrationForm').and.callThrough(); //callThrough()
component.submitRegistrationForm();
expect(component.profileForm.invalid).toBe(false);
expect(component.submitRegistrationForm).toHaveBeenCalled();
expect(myService).toBeDefined();
expect(mySpy).toBeDefined();
expect(mySpy).toHaveBeenCalledTimes(1);
expect(router.navigate).toHaveBeenCalled();
})
));
Run Code Online (Sandbox Code Playgroud)
该spyOn会帮助您设置功能应该如何反应,当它在你的测试被调用。基本上它是 Jasmines 创建模拟的方式。
在您的情况下,您已经定义了在调用服务函数时测试应该做什么,即callThrough. 问题是您还需要对服务函数(或调用您的服务方法的作用域函数)进行操作以触发spyOnwhich will callThrough。
it('load snapshot',function(){
//setup
spyOn(MyService, 'loadSomething').and.callThrough(); //statement 2
//act
//either call the scope function which uses the service
//$scope.yourServiceCallFunction();
//or call the service function directly
MyService.loadSomething(1); //this will callThrough
});
Run Code Online (Sandbox Code Playgroud)
这是一个简单的测试,我们将模拟对spyOn字符串的响应
it('test loadSomething',function(){
//setup
spyOn(MyService, 'loadSomething').and.returnValue('Mocked');
//act
var val = MyService.loadSomething(1);
//check
expect(val).toEqual('Mocked');
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22120 次 |
| 最近记录: |