2016-07-29 12 views
2

適用されます。

angular.module('domeeApp') 
     .factory('streamWidget', streamWidgetFactory); 

    function streamWidgetFactory($q) { 
     return { 
      loadContent: function() { 
       return $q(function(resolve, reject) { 
        resolve('test'); 
       }) 
      } 
     } 
    } 

私はカルマ/モカ/チャイでそれをテストしています:

describe('streamWidget', function() { 
    beforeEach(module('domeeApp')); 
    var streamWidget; 
    var $timeout; 

    beforeEach(inject(function(_$timeout_, _streamWidget_) { 
     streamWidget = _streamWidget_; 
     $timeout = _$timeout_; 
    })); 


    it('should load new content', function(done) {   
     streamWidget.loadContent() 
     .then(function(res) { 
      expect(res).to.equal('test'); 
      done(); 
     }) 
     .catch(function(){}) 
     $timeout.flush(); 
    });  
}); 

ので、$ qを約束しますmochaとうまく動作しません私は.thenの約束を強制的に実行するように$timeout.flush()を追加すると言われているthis answerに従っています。

問題は().flushを呼び出した後、ある、すべての私のアプリは起動し、私は角-モックからこのエラーを取得するために開始します。

Error: Unexpected request: GET /partials/page/view/index

私は約$ httpBackendを知っていますが、という狂った私のアプリが起動時に行っているすべてのリクエストを模擬するでしょう。

$timeout.flush()または$rootScope.$apply()を呼び出すことなく$q約束はモカと連携させるための方法はありますか?

+0

問題の対象は、モカではなくチャイです。可能性のある複製http://stackoverflow.com/a/37374041/3731501 – estus

+0

質問の主題は$ qサービスであり、どのようにしてapply/flushを使わずに$ q約束を解決することができます。チャイはそれとは関係ないので、私はチャイを約束どおりに使っていないからです。少なくとも、これは私が状況を見る方法です、あなたが同意しないなら、それをより良く説明しようとしてください。 – pietrovismara

+0

モカではなくアサーションをするのはチャイです。さて、あなたはchai-as-promisedの使用を検討するかもしれません。それは、 'then apply'の後に' $ apply() 'や' $ digest() 'を呼び出さずに$ q約束のアサーションを行う方法です。 – estus

答えて

1

hereのように、chai-as-promisedを使用して$q約束を表明することができます。このセットアップ

chaiAsPromised.transferPromiseness = function (assertion, promise) { 
    assertion.then = promise.then.bind(promise); 

    if (!('$$state' in promise)) 
    return; 

    inject(function ($rootScope) { 
    if (!$rootScope.$$phase) 
     $rootScope.$digest(); 
    }); 
}; 

サイクルをダイジェストで は全体約束チェーンを実行し、約束の表明に自動的にトリガされます。この場合、スペック

it('...',() => { 
    ... 
    expect(...).to.eventually...; 
    expect(...).to.eventually...; 
    $rootScope.$digest(); 
}); 

$digest()コールを省略し$q約束は同期していることを

it('...',() => { 
    ... 
    expect(...).to.eventually...; 
    expect(...).to.eventually...; 
}); 

お知らせになることができます

、彼らはモカ仕様から返されたりdoneコールバックを呼び出すべきではありません。

+0

私はあなたの解決策を試しましたが、結果は同じです。 '$ rootScope。$ digest()'を呼び出すと、 'chaiAsPromised.transferPromiseness'またはそれ以外の場所では、予期せぬリクエストについて同じエラーが出ます。実際に、最初から質問しているのは、$ digest/$ apply/$ flushを使わずにこのテストを行う方法です。この時点で私は解決策がないと思います。 – pietrovismara

+1

あなたは物事を混ぜているようです。これらはすべて別個の懸念事項です。 '$ digest()'は万能薬ではありません。あなたは '$ digest()'を起動して$ q約束を実行する必要があります(これが答えです)。 $ timeoutのタイムアウトを実行するには 'flush()'を呼び出す必要があります。単体テストで$ httpBackendリクエストを模擬する必要があります。それらをすべて模倣する必要はありません - テストされたユニットによって行われた要求だけです。これは角度検査の仕組みです。 – estus

0

我々決してが実際に$httpBackendを必要とするが、それは時々(ランダム)(これらのテンプレートは、$templateCacheで利用可能であっても)ディレクティブで使用されるテンプレートの要求を行うことができないためここでは、使用の代替戦略です:

beforeEach(function() { 
    module('app', function($provide) { 
    // This is using jasmine, but the idea is the same with mocha. 
    // Basically just replace $httpBackend with a function that does nothing. 
    $provide.constant('$httpBackend', jasmine.createSpy('$httpBackend')); 
    }); 
}); 

実際に$httpBackendとすると、レスポンスオブジェクトを模擬するために必要なので、これはうまくいかないでしょう。

関連する問題