【发布时间】:2015-08-13 20:59:41
【问题描述】:
是否可以测试Angular控制器的init进程?
代码如下:
var app = angular.module('led', []);
app.controller('zeppelin', ['$scope', function ($scope) {
$scope.love = function () {
return 2;
};
$scope.tangerine = $scope.love();
$scope.prove = function () {
$scope.love();
};
$scope.prove();
$scope.love();
}]);
测试代码:
scope = _$rootScope_.$new();
controller = _$controller_('zeppelin', {
$scope: scope
});
proved = sinon.spy();
loved = sinon.stub().returns(7);
scope.prove = proved;
scope.love = loved;
expect(proved.callCount).toBe(1); //=> 0
expect(loved.callCount).toBe(2); //=> 0
scope.prove();
expect(proved.callCount).toBe(2); //=> 1
expect(loved.callCount).toBe(3); //=> 0
我对上述代码的问题是:
- 我了解预期将失败,因为控制器已经初始化。如果我在初始化之前设置了 scope.prove = spied,那么即使在显式调用它们之后,我也会收到两者的 0。是否有测试 init 进程的可行方法?
- 如何存根 scope.love,以便 scope.tangerine 从存根而不是控制器接收数据?
- 为什么在调用 scope.prove() 后,loved.callCount 没有增加?
对我来说,最奇特的案例是 3,因为我想不出任何合乎逻辑的解释来解释这种奇怪的行为。
【问题讨论】:
-
对于案例 3 - 当控制器初始化时
$scope.prove持有对匿名函数function () { $scope.love(); }的引用,这将被sinon.spy返回的间谍函数替换,这是一个空函数不打电话给$scope.loved。您应该将现有的间谍包装在间谍中,而不是创建新的间谍。 Ej。sinon.spy($scope, 'prove'); -
谢谢!看来我没有正确设置间谍功能,因为我认为两种语法是相等的。
标签: angularjs unit-testing sinon