【问题标题】:Unexpected request error when unit-testing angular $http service单元测试角度 $http 服务时出现意外的请求错误
【发布时间】:2018-08-13 13:29:28
【问题描述】:

我在我的 angularJS 应用程序中使用单元测试。这是我的服务测试规范:

describe('service', function () {
    var service = {};
    var $httpBackend;

    beforeEach(module('myApp'));
    beforeEach(inject(function (_service_, _$httpBackend_) {
        service = _service_;
        $httpBackend = _$httpBackend_;
    }));

    it('should return test message', function () {
        var response;
        var test = "This is a test";

        $httpBackend.when('GET', '/api/Account/GetTest')
            .respond(200, test);

        service.getTest().then(function (data) {
            response = data;
        });

        expect(response).toEqual(test);
    });
});

还有,这是我的服务中的 getTest 函数:

var getTest = function () {
    return $http.get("api/Account/GetTest");
};

为什么会出现以下错误:

错误:意外请求:GET api/Account/GetTest

我还想如果我从规范中的 url 中删除斜杠,错误会变成这样(我不知道为什么):

错误:意外请求:GET /app/views/login.html

【问题讨论】:

    标签: angularjs unit-testing jasmine angular-mock ngmock


    【解决方案1】:

    正确的测试是删除斜线。你得到的错误:

    错误:意外请求:GET /app/views/login.html

    暗示 Angular 正在尝试意外下载模板。但是,由于您使用的是模拟 $http,因此您会因为意外请求而收到错误。

    可以添加如下内容:

    $httpBackend.when('GET', '/app/views/login.html')
            .respond(200, '');
    

    错误可能会消失,但是:

    1. 这可能会发现其他意外的模板检索
    2. 您的测试显示出意外行为,因此不太可能小到足以被视为单元测试。

    我建议您查看您的代码并找出加载登录模板的原因(很可能是您无意中加载了指令或组件)。然后您可以确定它是否确实应该成为测试的一部分,或者您是否应该以某种方式将其剔除。

    您可能也需要对其他模板执行此操作。

    【讨论】:

    • 看起来路由正在干扰它,或者我在routeChangeStart事件中的代码。你看到这个帖子了吗? stackoverflow.com/questions/23655307/…
    • 可能是路由干扰了测试,而这正是我要提出的观点。我猜你有一些在你的路由之前运行的身份验证逻辑。在您的测试中,您应该对其进行模拟,以免意外调用不相关的行为。
    • 我该怎么做?
    • 这取决于实现。您可以:1)通过环境变量或标志运行测试时避免加载路由,2)模拟您的身份验证检查,以便在运行测试时,您似乎总是登录(使用 jasmine 间谍),3)注销测试运行之前的路线。我更喜欢#2,但不知道你的实现,其他选项可能更有意义。
    猜你喜欢
    • 2014-11-27
    • 1970-01-01
    • 2018-10-03
    • 2013-07-28
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多