微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – Jasmine测试对象的Ajax方法spy调用状态

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

$scope.resource.update().then(successHandler, failureHandler);

我有一个间谍在这方法来存根Ajax调用,所以我可以单元测试控制器:

resUpdateSpy = spyOn($scope.resource, 'update').and.callFake(function() { 
  return {then: function(success, failure){ success(resUpdateResponse); }};
});

在我的一个控制器方法中,我希望使用某些数据(特别是条带数据)对资源进行POST.在POST之后,数据将以相同的方法被覆盖,因此我无法在之后测试模型的状态.理想情况下,我想要像:

expect($scope.resource.update).toHaveBeenCalled().whileValueOf($scope.resource.stripeKey).isEqualTo('tok123');

显然,香草茉莉花中不存在这方法.在调用给定的间谍时,Jasmine(通过vanilla或通过第三方项目)是否有办法测试值的状态?还是有另一种方法来测试这种情况 – 特别是在数据POST之前的模型状态 – 我错过了?

我在Angular 1.3.14应用程序上使用Teaspoon 1.0.2运行Jasmine 2.2.0.

解决方法:

因为你已经让你的间谍转发了对假函数调用,让假函数为你存储感兴趣的值:

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); }};
});

然后只需检查断言中存储的值:

expect(scopeResourceStripeKeyDuringSpyCall).toEqual('tok123');

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐