Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在测试angular 2组件时,如何模拟@injected服务?_Angular_Testing_Dependency Injection_Jasmine - Fatal编程技术网

在测试angular 2组件时,如何模拟@injected服务?

在测试angular 2组件时,如何模拟@injected服务?,angular,testing,dependency-injection,jasmine,Angular,Testing,Dependency Injection,Jasmine,我有一个带有签名的组件: constructor(private loremApiService: LoremApiService, private ipsumService: IpsumService, private dolorService: DolorService, @Inject('sitService') private sitService: library.service.Service) { } 元件的等级库文件设置为: let comp

我有一个带有签名的组件:

constructor(private loremApiService: LoremApiService,
      private ipsumService: IpsumService,
      private dolorService: DolorService,
      @Inject('sitService') private sitService: library.service.Service) {
}
元件的等级库文件设置为:

let component: PowerBiReportComponent;
let fixture: ComponentFixture<TestingComponent>;
const mockLoremApi = { methodThatIsCalled: () => {} };
const mockIpsumService = { };
const mockSitService = { };

beforeEach(async(() => {
    TestBed.configureTestingModule({
        declarations: [ TestingComponent ],
        schemas: [ CUSTOM_ELEMENTS_SCHEMA ],
        providers: [
            { provide: LoremApiService, useValue: mockLoremApi },
            { provide: IpsumService, useValue: mockIpsumService },
            UnmockedService,
            { provide: library.service.Service, useValue: mockSitService }
        ]
    })
    .compileComponents();
}));

beforeEach(() => {
    fixture = TestBed.createComponent(TestingComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
});

如何强制TestingModule使用mockSitService,尽管它被@Injected到组件中?

如注释中所述,Angular需要
@injecte(…)
中的任何标记与在使用Angular的DI设置服务时为
提供
属性提供的标记相同。这也意味着注入令牌应该导出到模块外部,以便其他人使用
@Inject()
语法

如果服务是这样提供的:

@NgModule({
    providers: [
        { provide: SERVICE_TOKEN, useClass: Service }
    ]
})
然后
@Inject()
应该这样设置(使用相同的注入令牌):

因此,在测试中,您可以通过以下方式模拟它(同样,使用相同的注入令牌):


有关注入令牌的更多信息,请参阅。

您是否尝试执行:
{provide:'sitService',useValue:mockSitService}
?@DanielWStrimpel不幸的是,未经授权的服务是通过
import*作为库从'sit library'导入的,所以我不能那么具体。同样,不幸的是,实际的服务类型被命名为
service
@Inject(…)
中的任何内容都应该作为
provide
属性给出。Angular的较新版本要求(或强烈建议?)这些是注入令牌@DanielWStrimpel Ahhh,我已在测试中更改了提供对象,以匹配组件父模块中的注入令牌。现在它抛出了一个
[object ErrorEvent]错误
,这可能是由于未实现模拟而导致实际测试代码失败的一部分。这可能会修复问题Check my response在这里您可以找到模拟服务的示例如果您有一个模块,它使用
forRoot
作为其可注入令牌,并且您想测试其中一个使用注入令牌的服务
MyModule.forRoot(MyModuleConstants)
有一个服务
MyModuleService
构造函数(@Inject(MyInjectionToken)常量)
useClass
而不是
useValue
?@gaoshenhan语法取决于您提供的内容。在模块中设置时,它使用
useClass
,以便Angular为您创建实例。在测试中,OP有一些变量是stubbed服务的实例,因此可以使用
useValue
版本的provide语法。
@NgModule({
    providers: [
        { provide: SERVICE_TOKEN, useClass: Service }
    ]
})
constructor(@Inject(SERVICE_TOKEN) private service: Service) {
}
beforeEach(async(() => {
    TestBed.configureTestingModule({
        providers: [
            { provide: SOME_TOKEN, useValue: mockService }
        ]
    })
    .compileComponents();
}));