eir*_*kir 5 javascript ajax unit-testing jasmine angularjs
我正在对一个 Angular 控制器进行单元测试,该控制器使用Rails 资源工厂来处理来自 Rails 应用程序的 GET 和 POST 模型数据。POSTing 是通过模型上的方法完成的,例如(使用 model $scope.resource):
$scope.resource.update().then(successHandler, failureHandler);\nRun Code Online (Sandbox Code Playgroud)\n\n我在这个方法上有一个间谍来阻止 Ajax 调用,这样我就可以对控制器进行单元测试:
\n\nresUpdateSpy = spyOn($scope.resource, \'update\').and.callFake(function() { \n return {then: function(success, failure){ success(resUpdateResponse); }};\n});\nRun Code Online (Sandbox Code Playgroud)\n\n在我的一种控制器方法中,我希望资源与某些数据(特别是条带数据)一起发布。数据将在相同方法的 POST 后被覆盖,因此我无法在之后测试模型的状态。理想情况下,我想要这样的东西:
\n\nexpect($scope.resource.update).toHaveBeenCalled().whileValueOf($scope.resource.stripeKey).isEqualTo(\'tok123\');\nRun Code Online (Sandbox Code Playgroud)\n\n显然,这种方法在香草茉莉中是不存在的。Jasmine 中有没有办法(无论是普通的还是通过第三方项目)来测试调用给定间谍时值的状态?或者是否有另一种方法来测试这种情况 \xe2\x80\x93 具体来说,模型在其数据发布 \xe2\x80\x93 之前的状态,我丢失了?
\n\n我正在 Angular 1.3.14 应用程序上运行 Jasmine 2.2.0 和 Teaspoon 1.0.2。
\n由于您已经让间谍将调用转发给假函数,因此让该假函数存储您感兴趣的值:
var scopeResourceStripeKeyDuringSpyCall = '(spy not called, yet)';
resUpdateSpy = spyOn($scope.resource, 'update').and.callFake(function() {
scopeResourceStripeKeyDuringSpyCall = $scope.resource.stripeKey;
return {then: function(success, failure){ success(resUpdateResponse); }};
});
Run Code Online (Sandbox Code Playgroud)
然后只需检查断言中存储的值:
expect(scopeResourceStripeKeyDuringSpyCall).toEqual('tok123');
Run Code Online (Sandbox Code Playgroud)
(根据间谍设置和断言是否在同一范围内,用于存储值的变量可能必须不太本地化。)
| 归档时间: |
|
| 查看次数: |
725 次 |
| 最近记录: |