Łuk*_*man 57 testing tdd angularjs
好吧,所以我长期以来一直在绊倒一些问题,我想听听社区其他人的意见.
首先,让我们看一些抽象的控制器.
function Ctrl($scope, anyService) {
$scope.field = "field";
$scope.whenClicked = function() {
util();
};
function util() {
anyService.doSmth();
}
}
Run Code Online (Sandbox Code Playgroud)
显然我们在这里:
$scope和注入的一些服务util()现在,我想在单元测试(Jasmine)中介绍这个课程.但是,问题是我想验证当我单击(调用whenClicked())某个项时util()将调用该方法.我不知道该怎么做,因为在Jasmine测试中我总是得到错误,无论是模拟util()还是没有被调用.
注意:我不是要修复这个特定的例子,我一般都在询问测试这样的代码模式.所以请不要告诉我"究竟是什么错误".我问的是如何做到这一点,而不是如何解决这个问题.
我一直在尝试各种方法:
$scope在我的单元测试中使用,因为我没有附加到此对象的此功能(它通常以消息Expected spy but got undefined或类似结尾)Ctrl.util = util;,然后验证模拟,Ctrl.util = jasmine.createSpy()但在这种情况下Ctrl.util没有被调用,因此测试失败util()以附加到this对象并Ctrl.util再次嘲笑,没有运气好吧,我无法找到解决这个问题的方法,我期待JS忍者的一些帮助,一个工作小提琴将是完美的.
小智 41
您提供的控制器功能将由Angular用作构造函数; 在某些时候,它将被调用new以创建实际的控制器实例.如果您确实需要在控制器对象中具有未暴露于$ scope但可用于间谍/存根/模拟的函数,则可以将它们附加到this.
function Ctrl($scope, anyService) {
$scope.field = "field";
$scope.whenClicked = function() {
util();
};
this.util = function() {
anyService.doSmth();
}
}
Run Code Online (Sandbox Code Playgroud)
当您现在调用var ctrl = new Ctrl(...)或使用Angular $controller服务来检索Ctrl实例时,返回的对象将包含该util函数.
你可以在这里看到这种方法:http://jsfiddle.net/yianisn/8P9Mv/
Mik*_*Mac 31
命名它的范围是污染.你想要做的是将该逻辑提取到一个单独的函数中,然后将其注入到Controller中.即
function Ctrl($scope, util) {
$scope.field = "field";
$scope.whenClicked = function() {
util();
};
}
angular.module("foo", [])
.service("anyService", function(...){...})
.factory("util", function(anyService) {
return function() {
anyService.doSmth();
};
});
Run Code Online (Sandbox Code Playgroud)
现在你可以使用模拟你的Ctrl 和 "util" 进行单元测试.
我打算采用不同的方法.你不应该测试私有方法.这就是为什么它们是私有的 - 这是一个与使用无关的实现细节.
例如,如果你意识到在几个地方使用了util,但是现在,根据其他代码重构,它只在这一个地方被调用.为什么有一个额外的函数调用?只是包含anyService.doSmith()在你内部$scope.whenClicked()通过上面的建议,假设您正在测试util()被调用,即使您没有更改程序的功能,您的测试也会中断.单元测试的主要价值之一是简化重构而不会破坏事物,所以如果你没有破坏,测试不应该失败.
您需要做的是确保$scope.whenClicked调用时anyService.doSmth()也称为.您只需要:
spyOn(anyService,'doSmith')
scope.whenClicked();
expect(anyService.doSmith).toHaveBeenCalled();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25316 次 |
| 最近记录: |