2015-07-10 44 views
0

我试图验证一个函数被点击链接后调用。在Jasmine测试中用jQuery调用点击,但看起来范围与测试中的控制器不同。在这种情况下我怎样才能使测试工作?有问题的代码可以在http://plnkr.co/edit/yqKme59WD9isrZTCutKB?p=preview找到。如何间谍控制器的功能,由用户界面点击的链接调用?

describe('Testing a Hello World controller', function() { 
    var $scope; 
    var ctrl; 

    //you need to indicate your module in a test 
    beforeEach(module('plunker')); 

    beforeEach(inject(function($rootScope, $controller) { 
    $scope = $rootScope.$new(); 

    ctrl = $controller('MainCtrl as mc', { 
     $scope: $scope 
    }); 

    spyOn(ctrl, 'loadData').and.callThrough(); 
    })); 

    it('should call load data', function() { 
    ctrl.loadData(); 
    console.log("1:" + ctrl.name); 
    expect(ctrl.loadData).toHaveBeenCalled(); 
    }); 

    it('should call load data after link cliked', function() { 
    $('#change-name')[0].click(); 
    console.log("2:" + ctrl.name); 
    expect(ctrl.loadData).toHaveBeenCalled(); 
    }); 
}); 
+1

模板确实与控制器无关,所以我只是直接通过调用它来测试控制器功能。对于你的测试,假装模板不存在,只是测试控制器的API – Phil

+0

这里是我的意思的例子〜http://plnkr.co/edit/4MsnnrWllcNdLBvqpKdr?p=preview – Phil

+0

有没有办法弄到该模板使用的控制器或范围?我只希望我能验证由UI事件引起的这种状态变化。 – barryku

回答

2

通常是分为单元测试和端到端测试的测试。

在单元测试中,您可以测试组件,控制器,服务......您可以测试控制器是否正确调用其依赖关系。

UI(点击,填写输入,...)主要是在浏览器中测试 - 硒,或http://www.protractortest.org/#/(万一角)

在你的样品,创建控制器的一个实例,但没有模板,没有DOM(仅适用于jasmine/test-runner DOM)。所以它不会工作。

+0

谢谢,我真正的测试实际上是将一个模板和$编译加载到DOM中。你的建议解决了部分问题,但我仍然面临着在控制器中设置到DOM中的$ digest变量的问题。前面的例子已经更新了工作代码,我将更新我后来遇到的问题。 – barryku

相关问题