【问题标题】:error while mocking in angular jasmine test在角茉莉花测试中模拟时出错
【发布时间】:2019-09-25 23:18:11
【问题描述】:

我在使用 jasmine 和 karma 时运行以下角度测试时遇到错误。我嘲笑了服务依赖 的组件。但是,组件中使用了 tradeservice 的功能。我试过嘲笑 功能,但它仍然抱怨

TypeError: this.tradeService.getCurrencyCodes is not a function

有什么问题?

在组件代码中

constructor(private tradeService: TradeService,
        private authService: AuthService,
        private orderService: OrderService,
        private valueDateService: ValueDateService,
        private dateService: DateService,
        private clientService: ClientService) {
    }

 ngOnInit() {
        this.getCurrencyCodes();
    }


  private getCurrencyCodes() {
        this.tradeService.getCurrencyCodes()
            .subscribe(
            data => {
                this.currencyList = data;
            },
            error => {
                this.messageViewerModel.messages.push("Unable to get Currency codes");
            });
    }

在组件的spec文件中

 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, useValue: MockDateService }],
                [{ provide: TradeService, useValue: MockTradeService }],
                [{ provide: AuthService, useValue: MockAuthService }],
                [{ provide: OrderService, useValue: MockOrderService }],
                [{ provide: ValueDateService, useValue: MockValueDateService }],
                [{ provide: ClientService, useValue: MockClientService }]
            ],
            schemas: [NO_ERRORS_SCHEMA]

        })
            .compileComponents();
    }));

    beforeEach(() => {

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


    });

    it('should be created', () => {

        expect(component).toBeTruthy();
    });


});

贸易服务

getCurrencyCodes() {
        return this.tradeEndpoint.getCurrencyCodesEndpoint<string[]>();
    }

【问题讨论】:

  • 您是否需要在测试顶部使用这些行,或者可以省略它们? let clientService: ClientService; let tradeService: TradeService;
  • 可以省略

标签: angular jasmine


【解决方案1】:

尝试在下一行将useValue 更改为useClass

[{ provide: TradeService, useValue: MockTradeService }],

【讨论】:

    【解决方案2】:

    尝试删除 beforeEach 中的 fixture.detectChanges,这可能是您的测试失败的原因,detectChanges 仅适用于 onPush 事件

    beforeEach(() => {
        fixture = TestBed.createComponent(StripOrderComponent);
        component = fixture.componentInstance;
        fixture.detectChanges(); // delete this
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 2016-11-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多