2016-05-11 1 views
1

私のジャスミンテストでAngularからのhttp呼び出しからの応答を模擬しようとしています。Jasmineでの角度付きHTTP応答がコールバック関数に入力されない

私は 'ImageService'というサービスを持っています。これには 'create'という1つの機能があります。私はエラーをテストしようとしているので、拒否された約束を作成し返すことを監視しています。

this.create = function(image) { 
    return imageApi.post(image); 
}; 

imageApi変数がRestangularインスタンスである:

は、ここに私のサービスです。私はそれが私のコントローラのエラーコールバックにその方法を作っていないこの約束を拒否しておりますが

spyOn(ImageService, 'create').and.callFake(function() { 
    var deferred = $q.defer(); 
    deferred.reject({ 
     data: { 
      status: 400, 
      errors: { 
       "image.fileNotImage": "File uploaded is not an image." 
      } 
     } 
    }); 
    return deferred.promise; 
}); 

私のテストでは、このようになります。私のコントローラからの呼び出しは、このように見えます。

ImageService.create(formData) 
    .then(function(response) { 
     console.log(response); 
       vm.imagePreview = response; 
       createAdMedia(adMedia, response.fileURL); 
     }, function(error) { 
       console.log(error); 
       /** 
       * If we get no data then we can assume its a 500 or 
       * 405 error so we give a generic error message 
       */ 
       if (error.data.errors) { 
        var errors = error.data.errors; 
        for (var key in errors) { 
         showMessage("errorMessage", DWIN.i18n.t(errors[key])); 
        } 
       } else { 
        showMessage("errorMessage", DWIN.i18n.t("merchant.admedia.failure")); 
       } 
     }); 

誰でも問題を見ることができますか?

ありがとうございます!

+0

あなたは私たちにテストコードの多くを示していることはできますか?テスト全体で、ジャスミンの期待を使用していることを意味します。 – sam

+4

テストで$ digest()を実行していないと思われます。角度はhttpコールを引き起こさないことを意味します。 – sam

+0

@sam thatsは真です。私はそれを試みます。 $ digest()の呼び出しは、スパイが設定された後に呼び出される必要がありますか? –

答えて

1

あなたはテストの完全なコードを提供していませんが、あなたがサービス関数を呼び出した後に$ digest()または$ apply()を実行するために省略したと思われます。この角度がないと、実行中のアプリケーションではなくテスト環境にあるため、通常は自動化された機能は実行されません。ここで

は、あなたがこの createメソッドを使用してコントローラをテストしていると仮定すると、あなたがより簡単に$ダイジェスト()と$ qを組み合わせることができます方法の例です:

beforeEach(inject(function ($rootScope, $controller, _$q_, _YourService_) { 
    $scope = $rootScope.$new(); 
    $q = _$q_; 
    YourService = _YourService_; 

    YourController = $controller('YourController', { $scope: $scope }); 
})); 

it('Should do something', function() { 
    spyOn(YourService, 'create').and.returnValue($q.reject({data: yourdata})); 

    YourController.theMethodThasUsesCreate(); 
    $scope.$digest(); 

    expect(something).toHaveBeenCalled(); 
}); 
+0

はい、ダイジェストへの呼び出しを追加すると完全に機能しました。説明をくれてありがとう、本当に助けてくれました。 –

+0

@DavidJones注:カスケードまたはインターバル/タイムアウトテストで約束した場合、ダイジェストを呼び出したり、同じテストで数回に渡ってメソッドを適用したりする必要があるということを意味します。 – sam

+0

素晴らしい、情報をありがとう! –

1

すべてのスタブのない概念のいくつかの証拠もの/メソッド。

angular.module('image', []) 
 
    .service('ImageService', function($q) { 
 
    this.create = function() { 
 
     return $q.when(); 
 
    } 
 
    }) 
 
    .controller('ImageCtrl', function(ImageService) { 
 
    ImageService.create() 
 
     .then(function(response) {}, function(error) { 
 
     console.error('error', error); 
 
     }); 
 
    }); 
 

 

 
describe('ImageCtrl', function() { 
 

 
    var $scope; 
 

 
    beforeEach(module('image')) 
 

 
    beforeEach(inject(function($rootScope) { 
 
    $scope = $rootScope.$new() 
 
    })) 
 

 
    it('ImageService.create() - supports rejection', inject(function($controller, $q, ImageService) { 
 
    var errorMessage = {data: {error: 'some error message'}} 
 
    spyOn(ImageService, 'create').and.returnValue($q.reject(errorMessage)) 
 
    spyOn(console, 'error') 
 
    
 
    $controller('ImageCtrl', { 
 
     $scope: $scope 
 
    }); 
 
    
 
    $scope.$digest(); 
 
    
 
    expect(console.error).toHaveBeenCalledWith('error', errorMessage) 
 
    })) 
 
})
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" /> 
 
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-mocks.js"></script>

関連する問題