在茉莉花中测试服务电话

时间:2018-04-09 19:44:15

标签: javascript angular jasmine

我正在尝试为调用服务的函数编写单元测试。但是我遇到了错误:TypeError: undefined is not a constructor

我要测试的是服务调用,成功时设置变量'cards'的值。

我已经为服务(CardService)创建了相应的模拟,您可以在下面的spec文件中看到

test.component.spec.ts

class MockCardService extends CardService {
    constructor() {
        super(null); // null is the http in service's constructor
    }
    getCardDetails(): any {
        return Observable.of([{ 0: 'card1' }, { 1: 'card2' }]);
    }
}

describe('MyComponent', () => {
    let component: MyComponent;
    let mockCardService: MockCardService;
    beforeEach(() => {
        mockCardService = new MockCardService();
        component = new MyComponent(
            mockCardService // add the mock service that runs before each test
        );
    });

// The failing test :(
it('should set the card variable to the value returned by the service', () => {

    spyOn(mockCardService, 'getCardDetails').and.callThrough();

    // Act
    component.ngOnInit();
    component.updateCards(); // call the function I am testing

    // Assert
    expect(component.cards).toConTainText('Card1');
});

带有我正在测试的功能的组件文件:

export class MyComponent implements OnInit {
    public cards: CardModel[] = [];
    constructor(
        private cardService: CardService,
    ) {
    }

    ngOnInit() {
        this.updateCards(); // call the update card service
    }

    updateCards(): void {
        this.cardService.getCardDetails().subscribe(
            (cardsDetails) => {
                this.cards = cardsDetails;
            },
            (err) => {
                // todo: error handling
                console.log(err);
            }
        );
    }
}

每当此测试运行时,我都会收到错误:

  

TypeError:undefined不是构造函数(评估'Observable_1.Observable.of([{0:'card1'},{1:'card2'}])')(第22行)   getCardDetails   updateCards   ngOnInit

我无法弄清楚我做错了什么,为什么'getCardDetals.subscribe'未定义。我提供的MockCardService类似乎由于某种原因而无法正常工作。

(请注意,如果我在组件本身中将其记录下来,则定义this.cardService.getCardDetails())

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

[9,16]应返回一个Observable,因此您可以在组件中运行subscribe。

答案 1 :(得分:0)

作者:

我仍然不确定会出现什么问题。但我能够通过将let MockCardService更改为this.refs.items.getWrappedInstance()并在整个过程中使用该变量来解决此问题。祝所有碰到这个的人好运!