一个新手Jasmine/Angular问题.
我在控制器中有一个命名函数,如下所示:
.controller( 'DummyCtrl', function DummyCtrl($scope){
var doSomething = function() {
return "blah";
};
})
Run Code Online (Sandbox Code Playgroud)
我需要测试这个函数,并尝试通过调用以下Jasmine规范:
describe ('myApp', function(){
var $scope, $controller;
var DummyCtrl;
beforeEach(module('myApp'));
describe('controllers', function(){
beforeEach(inject(function ($controller, $rootScope){
$scope = $rootScope.$new();
DummyCtrl = $controller('DummyCtrl', {$scope: $scope});
}));
describe( 'DummyCtrl', function(){
var blah;
beforeEach(function(){
blah = DummyCtrl.doSomething();
});
it('should do something', function(){
expect(blah).toContain("blah");
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
我没有解决问题,而是导致以下错误:TypeError: Object #<DummyCtrl> has no method 'doSomething'.我假设这是一个非常简单的东西,我不理解.
小智 18
在function DummyCtrl您提供用于控制器注册将通过角被用作构造函数.如果您需要控制器实例公开function doSomething而不将其附加到$scope,则应将其附加到this.
尝试改变
var something = function(...
Run Code Online (Sandbox Code Playgroud)
至
this.something = function(...
Run Code Online (Sandbox Code Playgroud)
你的测试应该有效.
你可以在这里看到这种方法:http://jsfiddle.net/yianisn/8P9Mv/.另外看看这个问题:如何用AngularJs中的私有方法编写可测试的控制器?
从某种意义上说,使用这样的函数是私有的,不能从函数外部访问.看一下这个链接:http://javascript.crockford.com/private.html
基本上所说的是在javascript中有一个函数/对象,带有this.前缀的任何东西都是公共的,带有var前缀的任何东西都是私有的.
对于Angular,您绝对可以拥有私有变量和函数,如果不仅仅是为了减少$scope变量的内存使用量.您的$scope对象应调用私有函数以获取用户显示/使用的值.尝试将其更改为:
.controller( 'DummyCtrl', function DummyCtrl($scope){
var doSomething = function() {
return "blah";
};
$scope.something=doSomething();
})
Run Code Online (Sandbox Code Playgroud)
然后用以下方法测试私有函数:
describe( 'DummyCtrl', function(){
var scope = {},
ctrl = new DummyCtrl(scope);
it('should do something', function(){
expect(scope.something).toMatch('blah');
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11808 次 |
| 最近记录: |