考虑下面的两段代码,取自the angular docs on unit testing:
在角度控制器中,控制器与DOM操作逻辑严格分开,这导致了一个更容易测试的故事,如下例所示:
function PasswordCtrl($scope) {
$scope.password = '';
$scope.grade = function() {
var size = $scope.password.length;
if (size > 8) {
$scope.strength = 'strong';
} else if (size > 3) {
$scope.strength = 'medium';
} else {
$scope.strength = 'weak';
}
};
}
并且测试很直接
var pc = new PasswordCtrl();
pc.password('abc');
pc.grade();
expect(pc.strength).toEqual('weak');
我想知道第二个代码段是如何工作的。没有模拟$ scope传递给它,但显然它的工作原理。此方法调用pc.password('abc');
和pc.grade()
似乎是$scope.password('abc')
和$scope.grade()
的别名,但这些别名来自何处?这个东西是有角度的吗?一种等同于ruby的method_missing?如果是这样,它是如何在引擎盖下工作的?
答案 0 :(得分:0)
不,它不能正常工作。如果我只是将你在这里的内容粘贴到2个文件中并告诉业力来运行它,我会收到以下错误。正如所料,错误是:
Chrome 26.0 (Mac) ERROR
Uncaught TypeError: Cannot set property 'password' of undefined
at /Volumes/.../utest/test/ctrl.js:2 Chrome
26.0 (Mac): Executed 0 of 0 ERROR (0.173 secs / 0 secs)
其中ctrl.js:2
是:
$scope.password = '';
遗憾的是,AngularJS文档并不清楚。所有测试必须在describe
块内进行,因此文档必须假定读者知道模拟beforeEach
块中所需的$ scope。