如何在不使用TestBed的情况下模拟服务

时间:2017-08-23 15:45:58

标签: angular unit-testing mocking components testbed

我想在不触及外部模板的情况下为我的组件编写一些单元测试。但我不知道如何模拟我的组件所依赖的服务。

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 等。我怎样才能避免这种情况?

1 个答案:

答案 0 :(得分:2)

可以按原样提供完全符合原始类接口的服务模拟:

myComponent = new MyComponent(stub);

如果模拟部分符合界面并且没有通过类型检查,则可以使用type assertion

myComponent = new MyComponent(<AnotherService>stub);

当类型根本不匹配时,可以使用双重断言:

myComponent = new MyComponent(<AnotherService><any>stub);