Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何在无后端应用程序中使用单元测试?_Angularjs_Unit Testing_Mocking - Fatal编程技术网

Angularjs 如何在无后端应用程序中使用单元测试?

Angularjs 如何在无后端应用程序中使用单元测试?,angularjs,unit-testing,mocking,Angularjs,Unit Testing,Mocking,我用一个单元测试创建了一个没有后端的应用程序,该测试是一个http get调用,我的问题是当我删除主应用程序中的ngMockE2E模块和app.run()中的伪后端http get处理程序时,一切正常,但当在app.run()中添加addngMockE2E和伪后端http get处理程序时然后运行测试此错误将出现: Error: No pending request to flush ! createHttpBackendMock/$httpBackend.flush@C:/app-se

我用一个单元测试创建了一个没有后端的应用程序,该测试是一个http get调用,我的问题是当我删除主应用程序中的
ngMockE2E
模块和app.run()中的伪后端http get处理程序时,一切正常,但当在app.run()中添加add
ngMockE2E
和伪后端http get处理程序时然后运行测试此错误将出现:

Error: No pending request to flush !
    createHttpBackendMock/$httpBackend.flush@C:/app-server-ui/libs/angular/angular-mocks/angular-mocks.js:1779:1
    @C:/app-server-ui/test/signin.controller.test.js:35:7
    invoke@C:/app-server-ui/libs/angular/angular/angular.js:4523:14
    workFn@C:/app-server-ui/libs/angular/angular-mocks/angular-mocks.js:2810:11
    angular.mock.inject@C:/app-server-ui/libs/angular/angular-mocks/angular-mocks.js:2778:25
    @C:/app-server-ui/test/signin.controller.test.js:17:35
    @C:/app-server-ui/test/signin.controller.test.js:16:3
    @C:/app-server-ui/test/signin.controller.test.js:4:1
我的测试文件是:

describe("SigninCtrl", function () {

  var $httpBackend, $controller, $rootScope, createController, authRequestHandler;
  beforeEach(module("app"));

  beforeEach(inject(function ($injector) {
    $controller = $injector.get("$controller");
    $httpBackend = $injector.get("$httpBackend");
    authRequestHandler = $httpBackend.when("GET", "/signin")
      .respond({username: "admin", password: "admin"});
  }));

  describe("auth user", function () {
    it("user pass must be admin", inject(function ($http) {

      var $scope = {};

      /* Code Under Test */
      var controller = $controller("SigninCtrl", {$scope: $scope});
      /* End */
      $http.get("/signin.py")
        .success(function (data) {
          $scope.user = data.user;
        });
      $httpBackend.whenGET('/signin.py').respond({
        "user": {
          "username": "admin",
          "password": "admin"
        }
      });

      $httpBackend.flush();
      expect($scope.user).toEqual({username: "admin", password: "admin"});
    }));
  })
});
我的应用程序运行功能是:

angular
    .module('app')
    .run(runBlock)
    .config(config);
  runBlock.$inject = ['$rootScope', '$state', '$stateParams', '$httpBackend'];
  function runBlock($rootScope, $state, $stateParams, $httpBackend) {
    $rootScope.$state = $state;
    $rootScope.$stateParams = $stateParams;
    $httpBackend.whenGET(/(\.html|\.svg)/).passThrough();
    $httpBackend.whenGET('/signin.py').respond({
      "user": {
        "username": "admin",
        "password": "admin"
      }
    })
  }

我不明白您为什么在生产代码中使用
$httpBackend
。这只是为了测试。为什么要在测试中执行http请求?难道应用程序本身不应该触发那个呼叫吗?基本流程是:1。在测试中使用
$httpBackend
设置http调用的期望值。2.注入触发http调用的(例如)控制器。3.触发触发http调用的方法。4.
$httpBackend
现在将检查期望值是否与触发的http请求相同首先是,最好使用
$httpBackend
开发,而不是生产。其次,为了简单起见,我在测试中使用http请求,还有一个问题是,为什么测试中的模拟和应用中的模拟相互冲突?