TypeError: Невозможно прочитать свойство 'subscribe' из неопределенного при выполнении теста Жасмин с использованием кармы - PullRequest
0 голосов
/ 25 сентября 2019

Я получаю ошибку при выполнении следующего углового теста при использовании жасмина и кармы.Я подозреваю, что это вызов метода getCurrencyCodes в компоненте заказа полосы.Он вызывает метод getCurrencyCodes tradeservice, который возвращает наблюдаемое.Это издевательство, что я сделал неправильно?

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();
    });


});

1 Ответ

0 голосов
/ 26 сентября 2019

getCurrencyCodes должен возвращать Observable, чтобы вы могли подписаться на него.Так что вам нужно вернуть Observable (в вашем макете или шпионе).Несколько примеров:

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


Вы можете использовать разных создателей, таких как интервал, интервал, диапазон ... Если вы хотите, чтобы выполнялась фиктивная функция, тогда в своем шпионе нужно добавить callThrough

spyOn(MockTradeService, 'getCurrencyCodes').and.callThrough();

Если вы хотите вернуть другое значение, укажите:

spyOn(MockTradeService, 'getCurrencyCodes').and.returnValue(from([9, 11, 7]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...