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

How to mock a service without using 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;
}

可行,但我想模拟 AnotherService 而不是 null,所以我创建了一个模拟服务:

class AnotherServiceStub {
    toto: string
}

myComponent = new MyComponent(<AnotherService> new AnotherServiceStub());

但以 ActivatedRoute 为例,

component = new MyComponent(<ActivatedRoute> {});

不起作用。 Typescript 要求我将 ActivatedRoute class 的所有属性添加到我的模拟中,例如 urlparamsqueryParams,等等。我怎样才能避免这种情况?

完全符合原class接口的服务mocks可以按原样提供:

myComponent = new MyComponent(stub);

如果模拟部分符合接口且未通过类型检查,则可以使用type assertion

myComponent = new MyComponent(<AnotherService>stub);

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

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