我正在对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] 举报,一经查实,本站将立刻删除。