Jasmine 测试 Ajax 方法间谍调用上对象的状态

eir*_*kir 5 javascript ajax unit-testing jasmine angularjs

我正在对一个 Angular 控制器进行单元测试,该控制器使用Rails 资源工厂来处理来自 Rails 应用程序的 GET 和 POST 模型数据。POSTing 是通过模型上的方法完成的,例如(使用 model $scope.resource):

\n\n
$scope.resource.update().then(successHandler, failureHandler);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在这个方法上有一个间谍来阻止 Ajax 调用,这样我就可以对控制器进行单元测试:

\n\n
resUpdateSpy = spyOn($scope.resource, \'update\').and.callFake(function() { \n  return {then: function(success, failure){ success(resUpdateResponse); }};\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的一种控制器方法中,我希望资源与某些数据(特别是条带数据)一起发布。数据将在相同方法的 POST 后被覆盖,因此我无法在之后测试模型的状态。理想情况下,我想要这样的东西:

\n\n
expect($scope.resource.update).toHaveBeenCalled().whileValueOf($scope.resource.stripeKey).isEqualTo(\'tok123\');\n
Run 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

das*_*s-g 2

由于您已经让间谍将调用转发给假函数,因此让该假函数存储您感兴趣的值:

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)

(根据间谍设置和断言是否在同一范围内,用于存储值的变量可能必须不太本地化。)