我想在不触及外部模板的情况下为我的组件编写一些单元测试。但我不知道如何模拟我的组件所依赖的服务。
my-component.ts
@Component({
selector: 'my-component',
templateUrl: './my-component.component.html',
styleUrls: ['./my-component.component.scss']
})
export class MyComponent {
constructor(public service: AnotherService) {}
}
my-component.spec.ts
let component: MyComponent;
beforeEach(() => {
myComponent = new MyComponent(null);
});
another.service.ts
@Injectable()
export class AnotherService {
toto: string;
}
虽然有效,但我想模仿null
而不是AnotherService
,所以我创建了一个模拟服务:
class AnotherServiceStub {
toto: string
}
和
myComponent = new MyComponent(<AnotherService> new AnotherServiceStub());
但是以 ActivatedRoute 为例,
component = new MyComponent(<ActivatedRoute> {});
不起作用。 Typescript要求我将ActivatedRoute类的所有属性添加到我的模拟中,如 url , params , queryParams 等。我怎样才能避免这种情况?
答案 0 :(得分:2)
可以按原样提供完全符合原始类接口的服务模拟:
myComponent = new MyComponent(stub);
如果模拟部分符合界面并且没有通过类型检查,则可以使用type assertion:
myComponent = new MyComponent(<AnotherService>stub);
当类型根本不匹配时,可以使用双重断言:
myComponent = new MyComponent(<AnotherService><any>stub);