【发布时间】:2020-06-26 19:48:34
【问题描述】:
我在一个 Angular 9 项目中工作。我创建了一个类,它是另一个组件中材质树的数据源。我真的只为组件编写测试,而不是类。 我在测试文件中创建此类的实例时遇到问题。我已经制作了模拟服务并将它们添加到测试文件中的 testBed,如下所示:
class MockMyService {
getData() {...}
}
describe("DynamicDataSource", () => {
let dynamicDataSource: DynamicDataSource;
let mockMyService: MockMyService;
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
{ provide: MyService, useClass: MockMyService }
]
}).compileComponents();
}));
beforeEach(() => {
mockMyService = TestBed.inject(MyService);
dynamicDataSource = new DynamicDataSource(null, null);
});
it("should create", () => {
expect(dynamicDataSource).toBeTruthy();
});
});
在上面我用dynamicDataSource = new DynamicDataSource(null, null);创建了一个类的实例但是,为了正确测试类中的函数,我需要将属性设置为模拟服务而不是null。
我认为我需要做这样的事情:dynamicDataSource = new DynamicDataSource(null, mockMyService);
但是,尝试这样做会给我一个错误 Argument of type 'MockMyService' is not assignable to parameter of type 'MyService'. Type 'MockMyService' is missing the following properties from type 'MyService': baseURL, http, logging
我无法在 MockMyService 中设置这些属性,因为它们是私有属性。 我能够在组件测试中模拟这样的服务,所以我很困惑为什么我必须在这些模拟中拥有这些属性。
有没有更好的方法来测试这个类?如何使用模拟服务在测试中创建它的实例?
任何建议都会有很大帮助。
这是课程(顺便说一句):
export class DynamicDataSource implements DataSource<DynamicFlatNode>, OnDestroy {
dataSubscription: Subscription;
constructor(
private _treeControl: FlatTreeControl<DynamicFlatNode>,
private _database: MyService
) {}
connect(collectionViewer: CollectionViewer): Observable<DynamicFlatNode[]> {...}
disconnect(collectionViewer: CollectionViewer): void {}
...lots of functions and logic...
ngOnDestroy(): void {
this.dataSubscription?.unsubscribe();
}
}
【问题讨论】:
-
接受的答案有效,但我也被建议通过组件测试类中的方法(我在组件中使用它,并且我能够使用模拟制作类的实例服务)。不过,这不是直接的单元测试。因此,您必须在使用
as any或通过组件进行测试之间做出选择。
标签: angular unit-testing angular-material angular9