3

我有一个 AngularJS/Rails 应用程序,我想测试我的 AngularJS 控制器在创建新记录时是否发布到后端服务器。(我正在使用茉莉花进行测试)

这是我尝试的测试

  describe "create", ->
    beforeEach(inject ( ($controller, $rootScope, $location, $state, $httpBackend) ->
      @redirect = spyOn($location, 'path')
      @httpBackend.whenGET('/assets/layouts/default.html.erb').respond(200)
      @httpBackend.whenGET('/assets/letters/index.html.erb').respond(200)
      @httpBackend.whenPOST('/api/letters').respond(200)

      $controller("LettersController", { $scope: @scope, $location: @location })
    ))

    it "sends a post to the backend", ->
      @httpBackend.expectPOST('/api/letters', {"letter":{},"_utf8":"☃"}).respond(200)
      @scope.create()

这是我正在测试的代码:

  $scope.create = ->
    Letter.save(
      {}
    ,
      letter:
        subject: $scope.letter.subject
        body: $scope.letter.body

    # success
    , (response) ->
      $location.path "/letters"
    # failure
    , (response) ->
    )

有问题的代码可以正常工作并且测试通过。问题是如果我将我的 Letter.save 代码注释掉(通过 AngularJS 资源发布),那么我的测试仍然通过。

我怎样才能让我的测试正常工作?

我的完整测试应用程序在这里:https ://github.com/map7/angularjs_rails_example2

4

2 回答 2

2

您需要验证在测试结束时没有未完成的请求:

$httpBackend.verifyNoOutstandingRequest();
于 2013-09-05T00:36:53.157 回答
1

您还需要验证没有未完成的期望$httpBackend.verifyNoOutstandingExpectation

我相信这应该可以防止你得到误报。

另外,我不确定你的 expectPOST 是否应该返回 true,因为你似乎没有发送"_utf8":"☃",但是我没有查看完整的源代码,所以我可能会遗漏一些东西。

我会尝试精简示例,以便您的 create 方法调用一个路由,并且您希望该路由被调用并从那里工作。您可以尝试删除 whenPOST 并将 expectPOST 替换为@httpBackend.expectPOST('/api/letters').respond(200)

于 2014-07-25T14:46:32.477 回答