E2E 模拟 $httpBackend 实际上对我来说并没有传递

2024-01-29

虽然我相信我正在遵循此处说明 http://docs.angularjs.org/api/ngMockE2E.%24httpBackend设置 $httpBackend 将选定的请求传递到服务器,它对我不起作用。

这是一个测试失败的 Plunkr http://plnkr.co/edit/FtWs9GUUK1KuFeitwUKX这显示了我正在做的事情,并在评论中解释了似乎出了什么问题。

我的探索表明,出于某种原因,模拟$httpBackend没有真实的内部副本$httpBackend这样,当需要传递 XHR 请求时,它会将其传递给模拟$httpBackend反而。第二次调用抛出异常,因为它不知道如何处理该请求。

对 dtabuenc 的回应

我很感激地记得你关于中途测试的帖子。您确定了介于单元测试和端到端测试之间的一系列重要的集成测试。我站在中间立场。

我不认为你是在刻薄。你的回答是完美合理的......或者它是合理的如果它与“的文本不矛盾”API 参考 / ngMockE2E / $httpBackend http://docs.angularjs.org/api/ngMockE2E.%24httpBackend“。 我引用:

此实现可用于通过静态或动态响应进行响应whenapi 及其快捷方式(whenGET, whenPOST等)和可选择将请求传递给真实的$httpBackend针对特定请求(例如与某些远程 API 交互或从网络服务器获取模板) ...

[I]在端到端测试场景中或者在开发应用程序时使用模拟替换真实后端 API 的情况,通常需要某些类别的请求绕过模拟和发出真实的http请求.... 要使用此行为配置后端,请使用passThrough请求处理程序的时间而不是respond.[强调我的]。

文档中没有提及 E2E 的问题$httpBackend在 Jasmine 环境中使用。我想不出有什么理由可以阻止它。如果有这样的理由,应该说清楚。说真的,谁读过关于mock组件并且不打算在测试环境中使用它?

To "将请求传递给真实的$httpBackend对于特定要求,例如与某些远程 API 交互“正是我想要做的。除了该组件的非模拟版本之外,“真正的 $httpBackend”可能意味着什么?

我不明白你的说法

The ngMocksE2E模块设计用于执行实际角度应用程序的“服务器”端。

“服务器”一词在该页面上出现了 3 次,一次都没有表明any应用程序代码将在“服务器”上执行。我不知道在“事物的‘服务器’端”执行的“实际的角度应用程序”是什么意思。

文档非常清楚,E2E$httpBackend不限于E2E测试。也是为了“开发应用程序时使用模拟替换真实后端 API 的场景".

这离我的场景只有半步之遥正在申请tested与真正的后端API."

在我的场景中,SUT 正在调用从服务器获取数据的组件。我的测试是为了验证这个依赖组件是否成功向真实后端发出此类请求,并将以预期的方式检索或保存数据。这是一个集成测试,无法通过模拟后端的行为来充分满足。

当然,我可以使用模拟 XHR 响应来测试(并进行测试)组件正确响应我的内容的能力predict将是后端的行为。这与验证组件是否正确响应actual后端的行为......随着应用程序的发展可能会发生变化,并以某种重要的方式偏离模拟响应。

如果我了解如何将其交换到 SUT 的代码路径中,我会考虑使用您的 midway 测试仪来实现此目的。我不。我认为您无法访问发出 XHR 请求的组件ngMidwayTester。但如果有必要,我确实知道如何将真正的 XHR 助手塞入管道中。

这就是我现在所处的位置.

有人可以展示如何制作$httpBackend将某些请求传递到服务器 - 正如文档声称它可以 - 或者我将替换passThrough我自己使用有效的 XHR 实现来实现。

我更喜欢第一个选择。如果被迫选择第二个,我将在此处提供一个链接,以便那些与我有共同需求和对 API 文档的解释的其他人受益。

我缺少第三种方式吗?


我偶然发现了同样的问题,但没有实现丰富的 API 或替换原始的角度模拟,而是简单地在以下帮助程序中添加:

angular.module('httpReal', ['ng'])
    .config(['$provide', function($provide) {
        $provide.decorator('$httpBackend', function() {
            return angular.injector(['ng']).get('$httpBackend');
        });
    }])
    .service('httpReal', ['$rootScope', function($rootScope) {
        this.submit = function() {
            $rootScope.$digest();
        };
    }]);

它修复了两个阻止 HTTP 请求通过的问题:

  1. 恢复原样$httpBackend;

  2. 提供一种方法来满足请求,否则它们将在 AngularJS 的队列中等待摘要循环。

describe('my service', function() {
    var myService, httpReal;

    beforeEach(module('myModule', 'httpReal'));

    beforeEach(inject(function( _myService_, _httpReal_ ) {
        myService = _myService_;
        httpReal = _httpReal_;
    }));

    it('should return valid data', function(done) {
        myService.remoteCall().then(
            function(data) {
                expect(data).toBeDefined();
                done();
            }, function(error) {
                expect(false).toBeTruthy();
                done();
            });

        httpReal.submit();
    });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

E2E 模拟 $httpBackend 实际上对我来说并没有传递 的相关文章

随机推荐