【发布时间】:2020-01-03 12:56:26
【问题描述】:
我正在使用 Angular 7.1 和 Jasmine 来测试我的组件。我正在尝试编写一些测试,但这对我来说似乎太多了。
我正在尝试测试的简化类:
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'a',
templateUrl: './a.html',
styleUrls: ['./a.scss']
}
export class A implements OnInit {
constructor(private http: HttpClient) {}
private privateState: State;
public publicState: State2;
ngOnInit() {
this.http.get(this.GetUrl()).subscribe((x) => {
this.privateState = x['whatever'];
});
}
private hiddenComplexFunction() {
this.publicState = this.privateState.something;
}
public testedFunction() {
//someComplex Code
this.hiddenComplexFunction();
}
}
我尝试过的:
- 我尝试设置私有变量,如
A.['privateState'],但没有成功 - 我尝试使用 SpyOn http get,但遇到了同样的问题,必须设置私有属性
- 我尝试使用 HttpClientTestingModule,但遇到与上一点相同的问题
-
最后,我尝试让 privateState 受到保护,并通过以下方式对其进行测试:
import { HttpClientTestingModule } from '@angular/common/http/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; class AMock extends A { ngOnInit() { //privateState is now protected this.privateState = mockedState; } } describe('A', () => { let component: AMock; let fixture: ComponentFixture<AMock>; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], declarations: [AMock] }) .compileComponents().catch(); })); beforeEach(() => { fixture = TestBed.createComponent(AMock); component = fixture.componentInstance; }); it('testedFunction should set up public state correctly', () => { component.testedFunction(); expect(component.publicState).toEqual(mockedState.something); });运行
ng test命令后,由于无法读取未定义的属性“testedFunction”,最后一点不起作用。
我不知道哪种方法是正确的测试方法。我知道我可以将hiddenComplexFunction 公开,我所有的问题都消失了,而且我不喜欢这样一个事实,即由于测试我必须更改访问修饰符(从私有到受保护的模拟示例中似乎全部我错了)。
【问题讨论】:
-
这是一个纯类,还是一个组件?您没有 @Component 装饰器,但正在尝试使用 onInit 并尝试在测试中将其实例化为 componentFixture。如果它是一个类,那将是一个不同的答案,如果它是一个组件。
-
它是一个组件,我会添加装饰器
标签: javascript angular jasmine