Angular TypeError:无法读取属性';订阅';使用karma运行jasmine测试时未定义的

Angular TypeError:无法读取属性';订阅';使用karma运行jasmine测试时未定义的,angular,jasmine,Angular,Jasmine,我在使用jasmine和karma运行以下角度测试时出错。我怀疑的是打电话给 带订单组件中的getCurrencyCodes方法。它调用tradeservice getCurrencyCodes方法,该方法返回一个可观察值。 是嘲笑我做错了吗 TypeError: Cannot read property 'subscribe' of undefined StripOrdercomponent html ngOnInit() { this.getCurrencyCodes()

我在使用jasmine和karma运行以下角度测试时出错。我怀疑的是打电话给 带订单组件中的getCurrencyCodes方法。它调用tradeservice getCurrencyCodes方法,该方法返回一个可观察值。 是嘲笑我做错了吗

TypeError: Cannot read property 'subscribe' of undefined
StripOrdercomponent html

 ngOnInit() {
        this.getCurrencyCodes();
    }

  private getCurrencyCodes() {
        this.tradeService.getCurrencyCodes()
            .subscribe(
            data => {
                this.currencyList = data;
            },
            error => {
                this.messageViewerModel.messages.push("Unable to get Currency codes");
            });
    }
带钢订单规格文件

class MockDateService {

}


class MockTradeService {
    getCurrencyCodes() {
        return;
    }
}

class MockAuthService {

}

class MockOrderService {

}

class MockValueDateService {

}

class MockClientService {

}


class MockMessageViewerModel {
    title: string;
    messages: string[];
   }

  @Component({
    selector: 'app-message-viewer',
    template: ''
  })
  class MockMessageViewerComponent {
    @Input()
    messageViewer: MockMessageViewerModel;    
  }

describe('StripOrderComponent', () => {
    let component: StripOrderComponent;
    let clientService: ClientService;
    let tradeService: TradeService;
    let fixture: ComponentFixture<StripOrderComponent>;


    beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [
                HttpClientModule,
                RouterTestingModule,
                FormsModule,
                TranslateModule.forRoot({
                    loader: {
                        provide: TranslateLoader,
                        useClass: TranslateLanguageLoader
                    }
                })
            ],
            declarations: [
                StripOrderComponent,
                MockMessageViewerComponent,

            ],
            providers: [
                [{ provide: DateService, useClass: MockDateService }],
                [{ provide: TradeService, useClass: MockTradeService }],
                [{ provide: AuthService, useClass: MockAuthService }],
                [{ provide: OrderService, useClass: MockOrderService }],
                [{ provide: ValueDateService, useClass: MockValueDateService }],
                [{ provide: ClientService, useClass: MockClientService }]


            ],
            schemas: [NO_ERRORS_SCHEMA]

        })
            .compileComponents();
    }));

    beforeEach(() => {

        fixture = TestBed.createComponent(StripOrderComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();


    });

    it('should be created', () => {
       // spyOn(MockTradeService, 'getCurrencyCodes').and.returnValue({ subscribe: () => {} })
        expect(component).toBeTruthy();
    });


});
类MockDateService{
}
类MockTradeService{
getCurrencyCodes(){
返回;
}
}
类MockAuthService{
}
类MockOrderService{
}
类MockValueDateService{
}
类MockClientService{
}
类MockMessageViewerModel{
标题:字符串;
消息:字符串[];
}
@组成部分({
选择器:“应用程序消息查看器”,
模板:“”
})
类MockMessageViewerComponent{
@输入()
messageViewer:MockMessageViewerModel;
}
描述('StripOrderComponent',()=>{
let组件:StripOrderComponent;
let clientService:clientService;
让tradeService:tradeService;
let夹具:组件夹具;
beforeach(异步(()=>{
TestBed.configureTestingModule({
进口:[
HttpClientModule,
路由器测试模块,
FormsModule,
TranslateModule.forRoot({
加载器:{
提供:TranslateLoader,
useClass:TranslateLanguageLoader
}
})
],
声明:[
StripOrderComponent,
MockMessageViewerComponent,
],
供应商:[
[{提供:日期服务,useClass:MockDateService}],
[{provide:TradeService,useClass:MockTradeService}],
[{提供:AuthService,useClass:MockAuthService}],
[{提供:OrderService,useClass:MockOrderService}],
[{提供:ValueDateService,useClass:MockValueDateService}],
[{提供:ClientService,useClass:MockClientService}]
],
架构:[无错误\u架构]
})
.compileComponents();
}));
在每个之前(()=>{
fixture=TestBed.createComponent(StripOrderComponent);
组件=fixture.componentInstance;
fixture.detectChanges();
});
它('应该创建',()=>{
//spyOn(MockTradeService,'getCurrencyCodes').and.returnValue({subscribe:()=>{})
expect(component.toBeTruthy();
});
});

getCurrencyCodes必须返回Observable,以便您可以订阅它。因此,您需要返回可观察的(在模拟或spyOn中)。几个例子:

class MockTradeService {
    getCurrencyCodes(): Observable<number> {
        return from([1, 4, 5]);
    }
}


如果要返回另一个值,请指定:

spyOn(MockTradeService, 'getCurrencyCodes').and.returnValue(from([9, 11, 7]));

因为您的`getCurrencyCodes()`返回
未定义的
spyOn(MockTradeService, 'getCurrencyCodes').and.returnValue(from([9, 11, 7]));