【问题标题】:Best way to mock $http promise in this scenario在这种情况下模拟 $http 承诺的最佳方式
【发布时间】:2015-04-15 04:59:49
【问题描述】:

我有一个工厂函数直接返回 http 承诺(它大约 3 层深,我根本不关心路径和返回的内容)

看起来像这样:

user.create()
    .success(function(result){})
    .error(function(err){})

我只想模拟成功和错误位。我曾尝试使用 $q 并解决或拒绝它,但这似乎不适用于成功和错误。

我的带有 q 的模拟工厂如下所示:

var user = {
    create: function (email) {
        var deferred = q.defer();
        deferred.resolve();
        return deferred.promise;
    }
};

这几乎就是我想要使用的。有没有办法 q 可以返回成功和错误而不是 then?


这样可以执行代码(我基于 $http 源代码),但不确定如何使用它测试逻辑

var factory = {
        factoryFunction: function () {
            var deferred = q.defer();

            //You can test that it was called here
            deferred.resolve();

            var promise = deferred.promise;
            promise.success = function (fn) {
                //Both success and error get called... be careful
                return promise;
            };

            promise.error = function (fn) {
                //Both success and error get called... be careful
                return promise;
            };
            return promise;
        }
    };

【问题讨论】:

  • 我们永远不需要从工厂返回承诺。你能说出这种情况吗,就像你采用这种方法的原因一样?你到底想让工厂做什么?
  • @manasisakare 这完全是错误的。当然,服务会返回承诺。
  • 我会重构调用代码并将返回的承诺视为常规承诺而不是 HTTP 承诺。注意 $q 有一个 .when() 方法,它返回一个已解决的承诺。

标签: angularjs unit-testing mocking


【解决方案1】:

如果你使用 Jasmine 来运行测试,你可以使用 spyOn。

spyOn(factory, 'create').andCallFake(function () { 返回 $.Deferred().resolve({ 返回对象:真 }); });

这个网站有一个关于如何使用 spyOn 的很棒的列表:http://tobyho.com/2011/12/15/jasmine-spy-cheatsheet/

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2014-08-29
    • 2018-10-15
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    相关资源
    最近更新 更多