首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jasmine控制器作为vm进行测试时出错

使用jasmine控制器作为vm进行测试时出错
EN

Stack Overflow用户
提问于 2016-11-15 13:05:10
回答 1查看 131关注 0票数 0

我正在尝试将控制器测试为vm,但会出错。

主要模块:

代码语言:javascript
复制
(function() {
    'use strict';

    angular.module('ds', [
            'ionic',
            'ui.router',
            'ds.controllers',
            'ds.services',
            'ds.filters',
            'underscore',
            'ionicLazyLoad',
            'ngCordova',
            'ngIOS9UIWebViewPatch'
        ])
})();

控制器代码如下:

代码语言:javascript
复制
(function() {
    'use strict';

    angular
        .module('ds')
        .controller('LoginCtrl', LoginCtrl);

    LoginCtrl.$inject = ["$scope", "$rootScope"];

    function LoginCtrl($scope, $rootScope) {

        var vm = this;

        vm.model = { name: "controllerAs vm test" };

    }
})();

我的茉莉花测试:

代码语言:javascript
复制
   'use strict';

    describe('LoginCtrl', function() {
        var LoginCtrl;
        beforeEach(module('ds'));

        beforeEach(function() {
            inject(function($injector) {
                LoginCtrl = $injector.get('$controller')('LoginCtrl', {});
            });
        });

    it('LoginCtrl should be defined and LoginCtrl.name is equal to controllerAs vm test', function() {
        expect(LoginCtrl).toBeDefined();
        expect(LoginCtrl.name).toEqual("controllerAs vm test");
    });
});

得到这个错误:

代码语言:javascript
复制
15 11 2016 14:40:33.608:INFO [watcher]: Changed file "/Users/roman.ishchiv/Documents/dogshows/www/modules/login/login.controller.js".
PhantomJS 2.1.1 (Mac OS X 0.0.0) LoginCtrl LoginCtrl should be defined and LoginCtrl.name is equal to controllerAs vm test FAILED
    /Users/roman.ishchiv/Documents/dogshows/www/lib/ionic/js/ionic.bundle.js:13218:53
    forEach@/Users/roman.ishchiv/Documents/dogshows/www/lib/ionic/js/ionic.bundle.js:9168:24
    loadModules@/Users/roman.ishchiv/Documents/dogshows/www/lib/ionic/js/ionic.bundle.js:13178:12
    createInjector@/Users/roman.ishchiv/Documents/dogshows/www/lib/ionic/js/ionic.bundle.js:13104:22
    workFn@/Users/roman.ishchiv/Documents/dogshows/www/lib/angular-mocks/angular-mocks.js:3074:60
    inject@/Users/roman.ishchiv/Documents/dogshows/www/lib/angular-mocks/angular-mocks.js:3054:46
    unit-tests/login.controller.test.js:8:15
    loaded@http://localhost:9876/context.js:151:17
    Expected undefined to be defined.
    unit-tests/login.controller.test.js:14:38
    loaded@http://localhost:9876/context.js:151:17
    TypeError: undefined is not an object (evaluating 'LoginCtrl.name') in unit-tests/login.controller.test.js (line 15)
    unit-tests/login.controller.test.js:15:25
    loaded@http://localhost:9876/context.js:151:17
PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.001 secs / 0.017 secs)

我的业力配置文件的这一部分:

代码语言:javascript
复制
files: [
    '../lib/ionic/js/ionic.bundle.js',
    '../lib/angular-mocks/angular-mocks.js',
    '../lib/jquery/dist/jquery.js',
    '../lib/angular-ui-router/release/angular-ui-router.js',
    '../js/*.js',
    '../js/**/*.js',
    '../modules/**/*.js',
    'unit-tests/*.js',
],

有没有人对如何解决这个问题有任何建议,或者有指导如何与约翰帕帕角风格指南和单元测试?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-15 13:08:47

我们使用这种结构进行测试(尽管我们使用ES6 vs ES5):

代码语言:javascript
复制
let vm;
inject((_$controller_, _$rootScope_) => {
  vm = _$controller_(SomeControllerImport,
    { $scope: _$rootscope.$new() });
});

然后,在您的测试中,您可以像在常规控制器代码中一样直接引用vm:

代码语言:javascript
复制
expect(vm.foo).toHaveBeenCalled();

诸若此类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40610559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档