我是编写单元测试的新手,不幸的是,我已经构建了一些复杂的" (对我而言)我很难开始编写测试的组件。
这是我的代码片段,包括构造函数。基本上,我现在并不关心这些依赖关系,我想测试一些内部函数,比如根据数组大小调整大小等等。对于这些,我可以创建一个Array.fill并且应该很好
export class GalleryComponent implements OnInit {
photos = [];
galleryState: Observable<any>;
constructor(
private store: Store<any>,
private photoActions: PhotoActions,
private router: Router
) {
this.galleryState = this.store.select<any>(state => state.photos.gallery);
}
}
在构造函数中没有任何内容的其他组件中,在我的测试中实例化组件就像new SomeComponent()
一样简单。
然而,在上面的GalleryComponent
中,我想知道是否有一种方法可以完全忽略依赖关系(现在),而只是以我可以测试一些内部的方式实例化组件功能很容易。例如,假设我在GalleryComponent中有以下功能:
function timesByTwo(number) {
return number * 2;
}
这与任何依赖项都没有关系,所以我如何只测试一个函数,因为该组件有3个依赖项?
由于
答案 0 :(得分:2)
如果您真的不关心与依赖项相关的任何测试,那么在您的规范中,您可以构建具有这些依赖项的空值的组件。
import { AppComponent } from './app.component';
describe('App: Test', () => {
let component: AppComponent;
beforeEach(() => {
component = new AppComponent(null, null, null);
});
it('should create the app', () => {
expect(component).toBeTruthy();
});
it(`Should return 4`, () => {
expect(component.timesByTwo(2)).toEqual(4);
});
}
要在构造函数中绕过this.store.select的当前用法,可以像这样修改构造函数
constructor(
private store: Store<any>,
private photoActions: PhotoActions,
private router: Router
) {
if(this.store == null){
this.galleryState = null;
}else{
this.galleryState = this.store.select<any>(state => state.photos.gallery);
}
}
否则,您可以在测试页面中模拟Store组件。一个例子
import { Observable } from 'rxjs/Rx'
export class MockService extends EventService{
constructor() { super(null); }
getEvents(user:string){
return Observable.of([{val: "test"}]);
}
}
然后将上面的代码修改为
let component: AppComponent;
let mockService: MockService;
beforeEach(() => {
mockService = new MockService()
component = new AppComponent(null, mockService, null);
});