gpt4 book ai didi

unit-testing - AngularJS : Need help to unit test a factory with promise

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

我有一个使用 promise 来解析 json 文件的工厂。
它应该只在第一次解析这个文件并在再次调用时返回结果。

这里是工厂

app.factory('getServerConfig', function ($q, $http, serverConfig) {

return function (fileName) {
var deferred = $q.defer();

if (serverConfig.loaded) {
deferred.resolve("alreadyLoaded");
} else {
$http.get(fileName).then(function (result) {
serverConfig.setConfig(result.data);
deferred.resolve("loaded");
}, function (result) {
deferred.reject();
});
}
return deferred.promise;
};
})

以及我如何测试它:
it('should say hallo to the World', inject(function(getServerConfig) {
var promiseResult;

getServerConfig("server-config.json").then(function (result) {
promiseResult = result;
});

rootScope.$apply();
expect(promiseResult).toBe('loaded');
}));

不幸的是,看起来 promiseResult 从未设置过。
这是一个代码: http://plnkr.co/edit/uRPCjuUDkqPRAv07G5Nx?p=preview

最佳答案

问题是 $httpBackend 要求 flush() (看看 Flushing HTTP requests ),所以你可以模仿 $http测试中的异步行为。

要解决它,请存储 $httpBackend 的引用(或再次注入(inject))并在发出请求后调用 $httpBack.flush() 。

看:

it('should say hallo to the World', inject(function(getServerConfig, $httpBackend) {
var promiseResult;

getServerConfig("server-config.json").then(function (result) {
promiseResult = result;
});

$httpBackend.flush();
expect(promiseResult).toBe('loaded');
}));

如果你要使用 $httpBackend在您的大多数规范中,考虑将其存储在局部变量中,并将其设置为 beforeEach .

关于unit-testing - AngularJS : Need help to unit test a factory with promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15833462/

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