Mar*_*Mar 6 unit-testing jasmine angular
我不知道如何测试组件方法是否在服务数据条件下被触发...
服务看起来像:
@Injectable()
export class SomeService {
someData() {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
补偿:
export class SomeComponent {
constructor(private someService: SomeService) {
if (this.someService.someData()) {
this.someMethod();
} else {
console.log('keep kalm!');
}
}
someMethod() {
console.log('some method is fired!')
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
describe('SomeComponent', () => {
let component: SomeComponent;
let fixture: ComponentFixture<SomeComponent>;
let mockSomeService = {
someData: () => true
}
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [SomeComponent],
providers: [
{
provide: SomeService, useValue: mockSomeService
}
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SomeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('method should be called', () => {
spyOn(component, 'someMethod');
expect(component.someMethod).toHaveBeenCalled();
});
});
Run Code Online (Sandbox Code Playgroud)
组件 someMethod 触发但测试失败:
预期间谍 someMethod 已被调用。
我怎样才能解决这个问题?
提前致谢!
好的它是固定的!感谢@Supamiu 的回答
以防将来有人需要它:
将初始化移动到 ngOnInit 中,移除 fixture.detectChanges(); 从 beforeEach 并在测试中执行它。所以:
比较:
constructor(private someService: SomeService) { }
ngOnInit() {
if (this.someService.someData()) {
this.someMethod();
} else {
console.log('keep kalm!');
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
beforeEach(() => {
fixture = TestBed.createComponent(SomeComponent);
component = fixture.componentInstance;
// fixture.detectChanges(); <<< Remove this
});
it('method should be called', () => {
spyOn(component, 'someMethod');
fixture.detectChanges(); // trigger ngOnInit here
expect(component.someMethod).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)
你设置间谍太晚了。当您安装 spy on service 时,它已经被构建someMethod并被调用。所以在defining组件调用spy之后
it('method should be called', () => {
var spy = spyOn(component, "someMethod").and.callThrough();
expect(component).toBeDefined();
expect(spy);
expect(component.someMethod).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17326 次 |
| 最近记录: |