【问题标题】:Error: Unexpected request: POST Karma-jasmine-angular错误:意外请求:POST Karma-jasmine-angular
【发布时间】:2015-07-08 08:33:59
【问题描述】:

实际情况就像我试图一起测试我的 Angular js 控制器和服务时,首先我调用 get ajax 请求,并在其成功后调用用户服务,其中还包含一个发布 ajax 请求。当我运行测试时,出现以下错误。

错误:意外请求:POST http://localhost:8080/services/access 预计不会有更多请求 /home/test/WebstormProjects/test2/bower_components/angular-mocks/angular-mocks.js

我在堆栈溢出中发现了一些类似的问题,但它不适合我的场景。这些是我发现的以下问题。

Unexpected request: GET No more request expected at $httpBackend

Mocking $httpBackend - how to handle "Unexpected request, No more request expected"?

AngularJS $httpBackend - "No more request expected" error

这是我尝试过的代码。

test.js

describe('Login controller',function(){

  beforeEach(module('app'));

  var httpBackend,ctrl, scope,userService;

  beforeEach(inject(function($controller, $rootScope,$httpBackend,$injector,_userService_) {

    scope = $rootScope.$new();
    httpBackend = $injector.get('$httpBackend');

    userService = _userService_;

    ctrl = $controller('LoginController', {
      $scope: scope
    });
  }));

  it('should set authentication true', function() {

    scope.authenticateUser();

    var username = 'test';
    var password = '123456';
    var requestToken = "";

    httpBackend.whenGET('http://localhost:8080/services/request').respond(200,{
      status : 0
    });

    httpBackend.expect('POST', 'http://localhost:8080/services/access').respond(200, {
      status:"success"
    });

    var returnedPromise = userService.authenticateUser(username,password,requestToken);

    httpBackend.flush();

    expect(scope.result).toEqual(0);

    httpBackend.verifyNoOutstandingExpectation();
    httpBackend.verifyNoOutstandingRequest();

  });
});

app.js

app.controller('LoginController', function LoginController($scope,$http,userService) {
  $scope.test="hello";
  $scope.authenticateUser = function(){
    var username = 'test';
    var password = '123456';
    var token = "";

    $http.get('http://localhost:8080/services/request').success(function(data) {
        $scope.result = data.status;
        userService.authenticateUser(username, password, "").then(function(response){});
    });
  };
});

userService.js

userService.authenticateUser = function(username, password,requestToken){

            var status = $http({
                method: 'POST',
                url: "http://localhost:8080/services/access",
                data: $.param({username:username,password:password,request_token:requestToken}),
                headers: {'Content-Type': 'application/x-www-form-urlencoded'}

            }).success(function(data, status, headers, config) {
                return data;

            }).
              error(function(data, status, headers, config) {
                return null;
            });
            return status;
        };

        return userService;

我是 karma-jasmine-angular 测试的新手,我正在努力应对这种情况。请为我提供适当的指导以解决这种测试情况。任何帮助将不胜感激。如果可能的话,请向我推荐一些好的演示来测试要求服务成功的服务。提前致谢。

【问题讨论】:

    标签: angularjs unit-testing jasmine webstorm karma-jasmine


    【解决方案1】:

    POST 请求http://localhost:8080/services/access 时,您忘记伪造后端响应。在测试中,您只测试预期的POST 请求,无论它是由正确的params 发出还是正确的params。只需添加虚假响应即可完美运行

    httpBackend
        .when('POST', 'http://localhost:8080/services/access')
        .respond(200, {
            status: "success"
    });
    

    Link fiddle 供您选择。

    【讨论】:

    • 您好,感谢您的回答。它现在正在工作。我已按照您的建议将我的 httpBackend 的 post call 从 'expect' 更改为 'when' 并且它现在正在工作。接受你的回答。谢谢你的小提琴。
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2016-01-17
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多