单元测试angular $ http服务时出现意外的请求错误

时间:2018-03-05 19:36:19

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

我在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

1 个答案:

答案 0 :(得分:0)

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

  

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

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

可以添加如下内容:

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

错误可能会消失,但是:

  1. 这可能会发现其他意外的模板检索
  2. 您的测试显示出意外行为,因此不太可能小到足以被视为单元测试。
  3. 我建议您查看代码并找出加载登录模板的原因(很可能是您无意中加载了指令或组件)。然后你可以确定它是否确实应该成为测试的一部分,或者你是否应该以某种方式将其存在。

    您可能还需要为其他模板执行此操作。