测试控制器语句未定义

问题描述 投票:0回答:2

嗨,我是新的测试与业力Jasmine。我正在尝试测试一个函数,但是它会抛出一个我尚未测试的值的错误是错误TypeError: Cannot set property 'statement' of undefined这是描述块切换选项按钮中的相关代码代码我收到错误(这是唯一的除了注入rootcope之外我添加的代码)

fdescribe('Online Statements', () => {
    const module = window.module;
    const inject = window.inject;

    beforeEach(module('wbbUiApp'));

    describe('Controller', () => {
        let scope;
        let controller;
        let injectibles;
        let bindings;

        const createController = userDetails => {
            inject(($componentController,
                $window,
                $filter,
                $rootScope) => {

                // The same `$inject` array values listed in `account-activity.controller.js`
                injectibles = {
                    $window,
                    $filter,
                    $rootScope
                };

                // The same bindings listed in `account-activity.component.js`
                bindings = {
                    accountDetails
                };

                controller = $componentController('onlineStatements', injectibles, bindings);
        });
     };
    describe('toggle options button', () => {
        //beforeEach(controller.statement = { showOptions: true })
        it('should set the scope value to the index', () => {
            const index = 1;
            const dateId = 1290488400000;
            controller.toggleOptions(index, dateId)
            expect(controller.activeRow).toEqual(index);
        })

    })

});

这是控制器中的代码错误正在发生因为this.statement.showOptions我试着将其注释掉,如果它不在控制器中它工作正常。我试过在construtor和init上设置它,就像这个statement: { showOptions: false }这样this.statement.showOptions = true;

toggleOptions(index, currentDate) {
        // toggle the dropdown with all buttons if its new then showing options is always true
        if (currentDate === this.currentSelectedDate) {
            this.statement.showOptions = !this.statement.showOptions;
        } else {
            this.statement.showOptions = true;
        }

        this.activeRow = index;
        this.currentSelectedDate = currentDate;
    }

这可能是一件简单的事情,因为我刚刚开始。先感谢您。

angularjs ecmascript-6 karma-jasmine
2个回答
1
投票
beforeEach(controller.statement = { showOptions: true })

不是一种有效的做事方式。

beforeEach接受一项功能。它应该是:

beforeEach(() => {
  controller.statement = { showOptions: true }
})

正如另一个答案所解释的那样,controller变量未在其使用的函数范围内定义。它是在兄弟姐妹declare中定义的。如果两个describe都使用具有相同本地依赖关系的控制器实例,则应将整个inject(($componentController, ...)移动到父describe,在那里它可以与beforeEach连接:

beforeEach(module('wbbUiApp'));

beforeEach(inject(($componentController, ...));

1
投票

您已将controller的变量范围限制为第一个describe()。在第二个describe()中,控制器因此而未定义。

© www.soinside.com 2019 - 2024. All rights reserved.