【问题标题】:Is there an easy way to whitelist HTTP requests with ngMockE2E是否有一种简单的方法可以使用 ngMockE2E 将 HTTP 请求列入白名单
【发布时间】:2016-01-19 15:14:13
【问题描述】:

由于一些基础架构更改(即服务器和 VPN),有时我想以 离线 模式运行我们的应用程序。我已经能够使用 ngMockE2E 来实现这一点,但这似乎是一种全有或全无的方法,这意味着您必须明确地将每个 HTTP 请求从应用程序中设置出来。

有没有办法让它假设除非您明确设置要处理的路由/url,否则它将自动调用通用passThrough() 操作?

目前我正在这样做:

noSrvc = $location.search().hasOwnProperty 'nosrvc'

#
# templates
#
$httpBackend.whenGET /(\.htm|\.html)$/
.passThrough();

#
# session
#
rqst = $httpBackend.whenGET /(api\/users\/current)$/
if !noSrvc then rqst.passThrough() else rqst.respond {"user":{

# doing something similar for every single service call in the app... gets tedious after about 3-4

我读过的关于该主题的大部分内容都涉及单元测试,并且没有真正解决隐含的传递,除非另有说明

【问题讨论】:

    标签: angularjs http coffeescript ngmocke2e


    【解决方案1】:

    这就是我用来列入白名单的方法

    app.run(function ($httpBackend) {
        // mocked requests, should come first
        $httpBackend.when('GET', 'mock').respond(200, {});
    
        // whitelisted real requests, should come last
        angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD', 'PUT', 'POST', 'PATCH'], function (method) {
            $httpBackend.when(method).passThrough();
        });
    });
    

    我很确定这里的优先级很重要。

    【讨论】:

    • 优先你的意思是你要建立那些你想首先拥有模拟数据的URL,然后否则条件最后?我明天试试这个。看起来超级简单,谢谢
    • @jusopi 是的,它按照 IIRC 的顺序评估条件。
    • 终于测试了一下,效果很好。将一堆讨厌的、难以阅读的 if/else 块简化为浓缩的代码块。谢谢。
    • 是的,优先级很重要,这真的很烦人 :( 当使用量角器和茉莉花时,它真的很难看,理想情况下,您希望将 passThrough() 的东西放在 beforeAll() 函数中,并且只有嘲笑测试中的(它),但由于优先级,您必须在每个测试中都包含它们:(
    • @IronHide 你总是可以用最少的代码做一些事情来达到所需的行为。例如。制作一个帮助函数或服务来定义所有提供的请求模拟并在之后执行passThrough(),或者在第一个请求上自动装饰$http 以执行passThrough()。为$httpBackend 提供内置的“直通”模式会很方便,但这可以通过一些开发人员的努力来解决。
    猜你喜欢
    • 2012-12-03
    • 2012-08-14
    • 2022-10-22
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多