web-dev-qa-db-ja.com

シノンでwindow.location.hrefをスタブする

クライアント側のコードをテストしようとしています。そのために、Mocha/Sinonを使用してwindow.location.hrefプロパティの値をスタブ化する必要があります。

私がこれまでに試したこと( この例を使用 ):

describe('Logger', () => {
    it('should compose a Log', () => {
        var stub = sinon.stub(window.location, 'href', 'http://www.foo.com');
    });
});

ランナーは次のエラーを表示します。

TypeError:カスタムスタブは関数またはプロパティ記述子である必要があります

テストコードを次のように変更します。

describe('Logger', () => {
    it('should compose a Log', () => {
        var stub = sinon.stub(window.location, 'href', {
            value: 'foo'
        });
    });
});

このエラーが発生します:

TypeError:文字列プロパティhrefを関数としてラップしようとしました

関数を3番目の引数としてsinon.stubに渡すことも機能しません。

偽のwindow.location.href文字列を提供し、リダイレクトも回避する方法はありますか(ブラウザでテストしているため)。

22

スタブは属性を置き換えることはできず、関数のみを置き換えます。

スローされたエラーはこれを補強します:

TypeError:カスタムスタブは関数またはプロパティ記述子である必要があります

ドキュメントから:

スタブを使用する場合

次の場合にスタブを使用します。

  1. テストからメソッドの動作を制御して、コードを特定のパスに強制的に送ります。例には、エラー処理をテストするためにメソッドにエラーをスローさせることが含まれます。

  2. 特定のメソッドが直接呼び出されないようにする場合(おそらく、XMLHttpRequestなどの望ましくない動作をトリガーするため)。

http://sinonjs.org/releases/v2.0.0/stubs/


可能な解決策

多くの組み込みオブジェクトは(テスト用に)置き換えることができますが、一部はできません。これらの属性については、コードで使用する必要があるファサードオブジェクトを作成し、テストでそれらを置き換えることができます。

例えば:

_var loc = {

    setLocationHref: function(newHref) {
        window.location.href = newHref;
    },

    getLocationHref: function() {
        return window.location.href;
    }

};
_

使用法:

_loc.setLocationHref('http://acme.com');
_

その後、テストで書くことができます

_var stub = sinon.stub(loc, 'setLocationHref').returns('http://www.foo.com');
_

連鎖returns()呼び出しに注意してください。コードに別のエラーがありました。3番目の引数は別の型の値ではなく関数でなければなりません。これはコールバックであり、属性が返すものではありません。

stub()のソースコードを参照

8

globalまたはwindowでテスト用のbeforeEachオブジェクトをモックするには、itを使用する必要があります。

例えば.

it('should compose a Log', () => {
   global.window = {
       location: {
           href: {
               value: 'foo'
           }
       }
   }
  //.... call the funciton 
});
17
KhaledMohamedP

_window.location_の値を上書きする代わりに、window.location.assign(url)を使用します。次に、_window.location_オブジェクトのassignメソッドをスタブするだけです。

http://www.w3schools.com/jsref/met_loc_assign.asp


更新:ヘッドレスブラウザーでこれをテストしましたが、Chromeでテストを実行すると動作しない場合があります。 @ try-catch-finallyの応答 を参照してください。

13
Danny Andrews