注入控制器和模拟AngularJS服务

时间:2012-09-20 15:04:10

标签: javascript unit-testing testing angularjs

我终于设法完成了一个非常简单的端到端测试,即

scenarios.js:

describe('My app', function () {
    beforeEach(function () {
        browser().navigateTo('/');
    });

    describe('On Load', function () {
        it('Textbox should be blank', function () {
            expect(input('textbox').val()).toBe('');
        });
    });
});

我的 runner.html 看起来像这样:

<head>
    <title>End2end Test Runner</title>
    <script src="/js/libs/angular-scenario.js" ng-autotest></script>
    <script src="/js/libs/angular-mocks.js"></script>
    <script src="/js/test/e2e/scenarios.js"></script>
</head>

这会启动我的网站,导航并检查输入是否为空白。王牌。

然而我现在想添加一个测试,扩展到目前为止的测试:

describe('Click on Add', function () {
    it('will add new item if valid', function () {
        input('newItemName').enter('Test Item');
        element('#add').click();
        expect(input('newItemName').val()).toBe('');
        expect(repeater('#items li').count()).toEqual(1);
    });
});

但在我运行此测试之前,我想模拟我的应用依赖的存储服务。

以下是控制器定义

myapp.controller('MyController', ['$scope', '$routeParams', '$filter', 'storage',
    function ($scope, $routeParams, $filter, storage) { 
        . . . . 
    }
]);

这导致了我的问题(我认为),因为我想做这样的事情:

describe('Controller Unit Tests', function(){
    var ctrl;

    beforeEach(function(){
        ctrl = new MyController();
    });

    it('should ....', function() {
        expect(true).toBe(true);
    });
});

但不能因为我宣布我的控制器的方式。而我以这种方式宣布我的控制器的原因是为了缩小目的......

有没有人就如何解决这个问题提出建议?!

1 个答案:

答案 0 :(得分:3)

尝试

function MyController($scope, $routeParams, $filter, storage) {}
MyCtrl1.$inject = ['$scope', '$routeParams', '$filter', 'storage'];