gpt4 book ai didi

AngularJS,对使用依赖于某些资源的服务的指令进行单元测试

转载 作者:行者123 更新时间:2023-12-03 08:21:01 26 4
gpt4 key购买 nike

我正在尝试对使用某些资源的服务的指令进行单元测试。我遇到的问题是当我模拟 get 时我的资源的方法将被模拟,但不会调用回调函数。因此,结果不会是预期的。

我尝试使用 spyOn 模拟资源根据建议 here ,还有 $httpBackend.when ,但都没有工作。当我调试代码时,它将到达 get 方法,但 get 回调函数永远不会被调用,因此,内部回调 myCallback这设置了我的值(value)永远不会被调用。
我不确定我的方法是否正确,感谢您的建议。

/资源

.factory ('AirportTimeZone', function($resource){
return $resource('/api/airport/:airportId/timezone',{airportId: '@airportId'});
})

/使用我的资源的服务:
angular.module('localizationService', [])
.factory('LocalizationService', ['AirportTimeZone','CurrentLocalization',
function (AirportTimeZone,CurrentLocalization) {

function getAirportTimeZone(airport,myCallback){
var options = {}
var localOptions = AirportTimeZone.get({airportId:airport}, function(data){
options.timeZone = data.timeZoneCode
myCallback(options)
});
}
})

/指令
.directive('date',function (LocalizationService) {
return function(scope, element, attrs) {
var airTimeZone
function updateAirportTimeZone(_airportTimeZone){
airTimeZone = _airportTimeZone.timeZone
// call other stuff to do here
}
....
LocalizationService.getAirportTimeZone(airport,updateAirportTimeZone)
....
element.text("something");
}
});

/测试
describe('Testing date directive', function() {
var $scope, $compile;
var $httpBackend,airportTimeZone,currentLocalization

beforeEach(function (){
module('directives');
module('localizationService');
module('resourcesService');
});

beforeEach(inject(function (_$rootScope_, _$compile_,AirportTimeZone,CurrentLocalization) {
$scope = _$rootScope_;
$compile = _$compile_;
airportTimeZone=AirportTimeZone;
currentLocalization = CurrentLocalization;

// spyOn(airportTimeZone, 'get').andCallThrough();
// spyOn(currentLocalization, 'get').andCallThrough();

}));

beforeEach(inject(function($injector) {
$httpBackend = $injector.get('$httpBackend');
// $httpBackend.when('GET', '/api/timezone').respond({timeZone:'America/New_York',locale:'us-en'});
// $httpBackend.when('GET', '/api/airport/CMH/timezone').respond({timeZone:'America/New_York'});
}))

describe('Date directive', function () {
var compileButton = function (markup, scope) {
var el = $compile(markup)(scope);
scope.$digest();
return el;
};

it('should',function() {
var html = "<span date tz='airport' format='short' airport='CMH' >'2013-09-29T10:40Z'</span>"
var element = compileButton(html,$scope)
$scope.$digest();

expected = "...."
expect(element.html()).toBe(expected);


});
});
})

最佳答案

如上所述:

使用 $httpBackend.when 设置响应后,您仍需调用 $httpBackend.flush()冲洗掉 mock 的回应。

引用文献:http://docs.angularjs.org/api/ngMock .$httpBackend - 刷新 http 请求部分

关于AngularJS,对使用依赖于某些资源的服务的指令进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19273732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com