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 に答える