TypeError:使用jasmine进行单元测试时,undefined不是对象

时间:2017-07-06 22:34:30

标签: javascript unit-testing jasmine

我正在尝试为函数编写单元测试,但是我收到了错误。我也不确定如何正确测试函数的其他部分。

private dictionaryMap (loggedIn, response) {
    const translations = this.convertToArrays(response.data.translations);

    this.configureMomentLocale(language);

    if (!loggedIn) {
        this.cachePublicDictionary(translations);
    }

    // not testing this part
    this.dictionary = new Dictionary({
        translationMap: Object.assign({}, this.getPublicDictionaryFromCache() || {}, translations),
    });

    return this.rx.Observable.of(this.dictionary);
}

到目前为止我的单元测试看起来像这样:

describe('dictionaryMap', () => {

    it('calls configureMomentLocale()', () => {
        const foo = {
            'foo':'bar',
        };
        spyOn(service, 'configureMomentLocale');
        service.dictionaryMap({}, false);
        expect(service.configureMomentLocale).toHaveBeenCalled();
    });

});

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

  

TypeError:undefined不是对象(评估'response.data.translationMap')

我是否需要模拟response.data.translations或指定json结构? (翻译地图:{'email':'email','forgotPassword':'忘记密码?'})

另外,我不确定如何正确测试函数的其他部分,比如if语句或返回observable。作为单元测试的新人,任何建议/帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

您的方法dictionaryMap接受2个参数 - 第1个是loggedIn(可能是布尔值),第2个是response。在该方法的第一行(在调用configureMomentLocale之前),您有一行const translations = this.convertToArrays(response.data.translations);,希望response变量具有名为data的属性。

在测试中,service.dictionaryMap({}, false);行上有2个错误:

  1. 你以相反的顺序设置参数 - 你应该先把布尔参数和对象放一秒
  2. 该对象没有名为data
  3. 的属性

    该行应更正为类似于service.dictionaryMap(false, { data: {} });的行。您甚至可能需要为translations对象定义data属性 - 它实际上取决于this.convertToArrays函数的作用以及它如何处理undefined值。