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_Karma Runner_Karma Jasmine - Fatal编程技术网

Angularjs 为什么我的因果报应单元测试失败了;意外请求;?

Angularjs 为什么我的因果报应单元测试失败了;意外请求;?,angularjs,unit-testing,karma-runner,karma-jasmine,Angularjs,Unit Testing,Karma Runner,Karma Jasmine,我的单元测试都失败了: Error: Unexpected request: GET views/partials/listings.html`. 我已经通读了这个SO问题:,但是讨论似乎解决了这个问题,使用的是,而不是。我曾尝试使用已接受答案中提到的.passThrough()方法,但出现以下错误: TypeError: '$httpBackend.whenGET('views/partials/listings.html').passThrough' is not a function`

我的单元测试都失败了:

Error: Unexpected request: GET views/partials/listings.html`.
我已经通读了这个SO问题:,但是讨论似乎解决了这个问题,使用的是,而不是。我曾尝试使用已接受答案中提到的
.passThrough()
方法,但出现以下错误:

TypeError: '$httpBackend.whenGET('views/partials/listings.html').passThrough' is not a function`
似乎
passThrough()
方法仅在
ngMockE2E$httpBackend
上可用

我编写测试来模仿AngularJS教程中的。这是我正在进行的测试:

(function() {
  'use strict';
  describe('Controller: ListingsCtrl', function() {
    var $httpBackend, ListingsCtrl, scope;
    $httpBackend = false;
    ListingsCtrl = false;
    scope = {};
    beforeEach(module('app'));
    beforeEach(inject(function(_$httpBackend_, $controller, $rootScope) {
      $httpBackend = _$httpBackend_;
      scope = $rootScope.$new();
      ListingsCtrl = $controller('ListingsCtrl', {
        $scope: scope
      });
      $httpBackend.expectGET('/api/listings/active').respond([
        {
          address: '123 Fake St'
        }, {
          address: '456 Other Ave'
        }
      ]);
    }));
    afterEach(function() {
      $httpBackend.verifyNoOutstandingExpectation();
      $httpBackend.verifyNoOutstandingRequest();
    });
    it('should have the correct default search parameters', function() {
      $httpBackend.flush();
      expect(scope.beds).toBe('Any');
      expect(scope.maxRent).toBe('None');
      expect(scope.search.address).toBe('');
      expect(scope.search.side).toBe('');
    });
    it('should have listings after loading them from the API', function() {
      expect(scope.listings.length).toBe(0);
      $httpBackend.flush();
      expect(scope.listings.length).toBeGreaterThan(0);
    });
  });

}).call(this);
在我测试的四个浏览器(Opera、Safari、Firefox和Chrome)中,这两个测试都失败,并显示相同的错误消息


我的印象是使用
karma
进行单元测试只加载控制器代码,因此不会尝试加载任何视图或模板。我弄错了吗?

好吧,我想这里有很多困惑,让我来解决一下。在深入研究技术细节之前,这里是单元测试的一些理想特性:

  • 我们希望我们的单元测试是快速的。燃烧得很快。原因是我们希望经常运行单元测试(您执行TDD,对吗?)
  • 单元测试设置应该尽可能简单。原因是我们希望整个过程尽可能简单。否则,人们将倾向于跳过测试,我们不希望代码中出现bug
假设我们希望我们的测试易于设置并快速运行,那么在使用模板测试指令时,您不应该通过HTTP提供模板服务。这样做将使整个设置更加复杂(您需要设置一个WWW服务器来提供模板,获得“正确”的路径等),并会降低测试速度(运行测试时的额外异步HTTP请求+网络流量)

您应该做的是将指令模板预加载到中。最简单的方法是使用。此预处理器可以获取HTML文件,将其字符串化为JS并放入
$templateCache
。如果您正在寻找使用此方法的完整项目设置,您可以在此处找到一个很好的示例:


总而言之:不要在测试设置中混合使用单元测试和e2e模拟。这使得它更复杂,运行更慢。将指令模板预加载到
$templateCache
中,而不是完全避免与
$http
的任何交互。

“不要在测试设置中混合使用单元测试和e2e模拟”-您能更透彻地解释这一点吗?我有单独的
量角器
e2e测试。我以AngularJS PhonecatApp为例介绍如何设置单元测试,特别是步骤5中的
test/unit/controllersSpec.js
。这不是真正的单元测试吗?我不认为我在用模板测试指令。我试着测试一个控制器。我所说的不混合单元和e2e测试的意思是不在同一个karma运行中混合它们。显然,单元测试和e2e测试可以单独运行。当涉及到使用templateUrl测试指令时——这是对您链接的另一个问题的回答。我不打算混合单元测试和e2e测试。我正在尝试对我的控制器进行单元测试。我不明白为什么会调用
GET view/partials/listings.html
。我不理解在控制器的单元测试期间如何或为什么加载任何视图或模板。@在本例中,BenHarold共享控制器的代码(理想情况下是整个代码+中的测试),因为它开始混淆您的实际问题。我也有这个问题“意外请求:获取”,在我的例子中,正在测试的控制器中调用另一个服务。该服务是$translate,并拉入一个translation.json文件。