Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度控制器:这些神奇的方法在这个单元测试中是如何工作的?_Javascript_Angularjs - Fatal编程技术网

Javascript 角度控制器:这些神奇的方法在这个单元测试中是如何工作的?

Javascript 角度控制器:这些神奇的方法在这个单元测试中是如何工作的?,javascript,angularjs,Javascript,Angularjs,考虑以下两段代码,它们取自: 在angular中,控制器与DOM操作逻辑严格分离,这导致了更容易的可测试性故事,如本例所示: 测试是直接的 我想知道第二段代码是如何工作的。没有向它传递mock$scope,但显然它可以工作。该方法还调用pc.password('abc')和pc.grade()似乎是$scope.password('abc')和$scope.grade()的别名,但这些别名来自哪里?这是内置的吗?一种与ruby的方法相当的方法?如果是这样,它在发动机罩下是如何工作的?不,它不能正

考虑以下两段代码,它们取自:

在angular中,控制器与DOM操作逻辑严格分离,这导致了更容易的可测试性故事,如本例所示:

测试是直接的


我想知道第二段代码是如何工作的。没有向它传递mock$scope,但显然它可以工作。该方法还调用
pc.password('abc')
pc.grade()
似乎是
$scope.password('abc')
$scope.grade()
的别名,但这些别名来自哪里?这是内置的吗?一种与ruby的方法相当的方法?如果是这样,它在发动机罩下是如何工作的?

不,它不能正常工作。如果我简单地将你在这里的内容粘贴到2个文件中,并告诉karma运行它,我会出现以下错误。正如预期的那样,错误是:

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文档并不清楚。所有测试必须在
description
块中进行,因此文档必须假设读者知道在每个
块之前模拟
中所需的$scope。

您确定此测试有效吗?你能提供plunker的实例吗?感觉有点可疑。这是我在OP中链接到的官方文件,所以我认为它是有效的。他们没有给出关于如何设置的详细信息,所以我自己也没有试过运行它。@pkozlowski.opensource,另外,我看到你写了一本关于angular的即将发行的书,所以如果你有关于angular单元测试的其他教程的建议,我将不胜感激。我想知道这段代码是否可能来自1.0之前的版本,您可以直接访问控制器实例上的作用域。这没有帮助,也无法回答问题。我高度怀疑官方文件是错误的。更可能的情况是,您不了解该示例是如何实现的,这本身并不构成犯罪,因为文档不清楚。但您似乎也不理解它们,因此这不符合我的问题的答案。我想我希望传达的是,代码并不像它那样工作。您的问题是:“我想知道第二个代码段是如何工作的。没有向它传递mock$scope,但它显然是工作的。”答案是:不,您必须模拟$scope。我会在回答中说明这一点。如果这是你的主张,那么还有一个隐含的后续问题:为什么文档中会有一个不起作用的例子?要让它工作,需要什么?声称官方文件中有一个完全错误的例子毫无意义需要证据和解释。你的编辑也没有解决这个问题。即使我们假设他们只是忘记在控制器构造函数中包含“$scope”,那么password()函数呢?那个setter函数是为任何属性自动创建的吗?很好。我想你刚刚在他们的文档中发现了一个错误。pc.password作为函数是没有意义的,但在控制器中它被初始化为空字符串,在grade函数中它检查长度。
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)
  $scope.password = '';