当前位置: 首页 > 面试题库 >

UI路由器干扰$ httpbackend单元测试,Angular JS

姜志
2023-03-14
问题内容

这是一个具有提交功能的控制器:

$scope.submit = function(){

 $http.post('/api/project', $scope.project)
      .success(function(data, status){
        $modalInstance.dismiss(true);
      })
      .error(function(data){
        console.log(data);
      })
  }
}

这是我的考验

it('should make a post to /api/project on submit and close the modal on success', function() {
    scope.submit();

    $httpBackend.expectPOST('/api/project').respond(200, 'test');

    $httpBackend.flush();

    expect(modalInstance.dismiss).toHaveBeenCalledWith(true);
  });

我得到的错误是:

Error: Unexpected request: GET views/appBar.html

views / appBar.html是我的templateUrl:

 .state('project', {
    url: '/',
    templateUrl:'views/appBar.html',
    controller: 'ProjectsCtrl'
  })

因此,以某种方式ui-router使我的$ httpBackend指向此位置而不是我的提交功能。使用$
httpBackend进行的所有测试都存在相同的问题。

有什么解决办法吗?


问题答案:

采取这个要点
https://gist.github.com/wilsonwc/8358542

angular.module('stateMock',[]);
angular.module('stateMock').service("$state", function($q){
    this.expectedTransitions = [];
    this.transitionTo = function(stateName){
        if(this.expectedTransitions.length > 0){
            var expectedState = this.expectedTransitions.shift();
            if(expectedState !== stateName){
                throw Error("Expected transition to state: " + expectedState + " but transitioned to " + stateName );
            }
        }else{
            throw Error("No more transitions were expected! Tried to transition to "+ stateName );
        }
        console.log("Mock transition to: " + stateName);
        var deferred = $q.defer();
        var promise = deferred.promise;
        deferred.resolve();
        return promise;
    }
    this.go = this.transitionTo;
    this.expectTransitionTo = function(stateName){
        this.expectedTransitions.push(stateName);
    }

    this.ensureAllTransitionsHappened = function(){
        if(this.expectedTransitions.length > 0){
            throw Error("Not all transitions happened!");
        }
    }
});

将其添加到test / mock文件夹中的名为stateMock的文件中,如果尚未将其包含在您的业力配置中。

测试之前的设置应如下所示:

beforeEach(module('stateMock'));

// Initialize the controller and a mock scope
beforeEach(inject(function ($state //other vars as needed) {
    state = $state;
    //initialize other stuff
}

然后在测试中,您应该添加

state.expectTransitionTo('project');


 类似资料:
  • 问题内容: 我正在尝试测试一些视图,这些视图用于链接到应用程序中的其他状态。在我的测试中,我触发了对此元素的点击,如下所示: 如果状态切换为,该如何测试?在我的控制器中像这样使用时,这很容易: 但是当我使用时,我不知道要监视什么对象。如何验证我的应用程序处于正确状态? 问题答案: 我自己找到的。在查看了角度ui路由器源代码后,我在指令中找到了以下行: 当元素收到点击时,会包装在回调中。因此,在测试

  • 问题内容: 正如我们在http://docs.angularjs.org/tutorial/step_07中看到的那样, 建议通过e2e测试来完成路由测试, 但是,我认为’$ routeProvider’配置是通过单个函数function($ routeProvider)完成的,我们应该能够在不涉及浏览器的情况下进行单元测试,因为我认为路由功能不需要浏览器DOM。 例如, 当url为/ foo时,

  • 问题内容: 我在应用程序中测试路由器时遇到了一些麻烦,该应用程序是基于Angular ui路由器构建的。我要测试的是状态转换是否适当地更改了URL(稍后将进行更复杂的测试,但这是我开始的地方。) 这是我的应用程序代码的相关部分: 和测试代码: 关于Stackoverflow的类似问题(以及官方ui路由器测试代码)表明,将$ state.go调用包装在$ apply中应该足够了。但是我已经做到了,状

  • 问题内容: 我有一个控制器,它从中获取值并将其发送到其他状态: 我不确定如何对该测试方法进行单元测试。我该如何验证go方法已被调用或对Karma / AngularJS进行某种处理? 问题答案: 这两种声音听起来都可以用Jasmine间谍来完成。 这里有一个很好的间谍的cheatsheet http://tobyho.com/2011/12/15/jasmine-spy- cheatsheet/

  • 问题内容: 对于我一生,我无法让$ httpBackend在执行$ http get请求的控制器上工作。我已经尝试了几个小时=) 我将其简化为下面可以最简单的形式。如果我通过测试 在控制器中注释掉$ http.get()请求 在测试中注释掉“ httpMock.flush()” 并更改“猪”和“狗”以匹配 也就是说,这是一个有效的工作测试和应用程序。 如果放回去,则会在底部显示错误。 app /

  • 我希望在由Capybara旋转的Chrome实例中禁用从onbeforeunload生成的对话框。我有一个非常大的测试套件,修改每次访问/刷新以包含单击“离开”确认的代码是不切实际的。 我尝试在访问和刷新之前添加,虽然这是可行的,但它共享了必须修改所有访问和刷新调用的问题。 我还检查了是否有任何ChromeCLI选项可以添加来禁用此功能,但我没有找到任何相关内容。我检查了这里:https://pe