7

注意:我在 CoffeeScript 中编写所有内容

我有一个控制器如下:

angular.module('myApp').controller 'MyController', ($scope, $routeParams, Batch) ->
    $scope.$on '$routeChangeSuccess', () ->
        Batch.get {batchUuid: $routeParams.batchUuid}, (response) ->
            $scope.batch_id = response.id

控制器拉入 Batch 资源,其定义如下:

angular.module('myApp').factory 'Batch', ($resource) ->
    $resource '/batches/:batchUuid', {}

我有一条路线如下:

$routeProvider.when('/batches/:batchUuid',
    { templateUrl: 'batches-processing.html', controller: 'MyController' })

所以:

  • 你访问路线/batches/22
  • 它使用 MyController
  • 它触发$routeChangeSuccess
  • 它调用从路由中获取批处理资源的批处理资源
  • 它返回一个 json 响应并将一个 id 分配给 $scope.batch_id

现在我想对此进行测试,所以我有一个单元测试如下:

describe 'Controllers', ->
    beforeEach module 'myApp'
        describe 'MyController', ->
            scope = {}
            ctrl= {}

            beforeEach inject ($rootScope, $controller, Batch, $httpBackend) ->
                scope = $rootScope.$new()
                ctrl = $controller('MyController', ($scope: scope))
                #I imagine I need to use either my injected Batch resource or the httpBackend to fake/expect the ajax call here

            it "Gets data from the resource and assigns it to scope", () ->
                #How on earth do I test this

我见过有人使用 $httpBackend.expect('/endpoint.json').respond({id:1}) 等,但我不能这样做。我的资源 URL 依赖于路由中的 batchUuid。我如何模拟/伪造/实现一个模拟路由更改、触发 $routeChangeSuccess、将 routeParameter 传递给资源、获取资源并测试结果的测试?

我正在把头发拉出来,而有角的文档似乎没有覆盖它。

谢谢!

4

2 回答 2

10

您可以制作一个假的 routeParams 并将其注入您的控制器。

我使用 jasmine 的 createSpy 来制作假货,但这可能有点矫枉过正。这里有一个例子展示了如何创建和注入假的 routeParams。

于 2012-11-10T01:33:29.010 回答
0

这个 js fiddle 显示了被注入的 routeParams:

http://jsfiddle.net/rimian/wgctykea/

it('should take articleId as id if specified', inject(function ($controller) {
  routeParams.articleId = 5;

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

  expect(scope.id).toEqual(5);
}));
于 2014-09-18T23:47:56.760 回答