2

次の単体テストが合格しない理由を知っている人はいますか?

describe("just a test", function () {
    it("should set the iframe location", function () {

        $('body').append('<iframe id="myiframe" name="myiframe"</iframe>');

        expect(window['myiframe'].location.href).toEqual('about:blank');

        window['myiframe'].location.assign('about:history');
        expect(window['myiframe'].location.href).toEqual('about:history');
    });
});

これは、実際のテストが機能しない理由を調べるための単純化されたコードです。クリーンアップなどについては気になりません。

2番目の期待は失敗します。このようにiframeの場所を変更しても機能しない理由はありますか?

(私は、Visual Studioアドインとコマンドラインの両方を使用して、Chutzpah v1.4.2でテストを実行しています。)

4

1 に答える 1

2

このテストが失敗する理由はたくさんあります。

  • タグに「about:history」をロードしようとすると<iframe>、少なくともFirefoxとChromeの両方で例外が発生します(おそらく、Chutzpahの下のPhantomJSでロードされます)。
  • ジャスミンが実行されている場所以外の別のドメインを読み込もうとすると、hrefプロパティにアクセスできなくなるため、機能しません。これは、ブラウザのクロスドメインセキュリティ制限によるものです。Firefoxは' Error: Permission denied to access property 'href''と言い、Chromeは' Unsafe JavaScript attempt to access frame with URL'と言います。フレームは適切にタフに表示されます。
  • testRunnerと同じドメインにあるURLをロードしても、hrefはその変更をすぐには反映せず、iframeがロードされるまで、2番目の期待値は失敗します(hrefは「about:blank」に等しくなります)。テストがすでに実行された後。

次の変更されたコードは、JasminewaitsFor()を使用runs()して、最後の問題を説明しています。条件が満たされるまで1000ms待機し、iframeロードを完了できるようにします。元の仕様をwait()ブロック内に残しましたが、タイムアウトがあるとwaitsForも失敗します。

describe("just a test", function () {
  it("should set the iframe location", function () {
    $('body').append('<iframe id="myiframe" name="myiframe"</iframe>');
    expect(window['myiframe'].location.href).toEqual('about:blank');

    window['myiframe'].location.assign('about:');

    waitsFor(function(){
      return window['myiframe'].location.href == 'about:'
    },1000);
    runs(function(){
      expect(window['myiframe'].location.href).toEqual('about:');
    });
  });
});

例外をスローしないことがわかっている唯一の-other-URLと同様に、「about:」(「空白」なし)も使用したことに注意してください。ただし、同じドメイン内の静的フィクスチャファイルのペアなど、別のものを使用することをお勧めします。

于 2013-01-08T21:50:39.153 に答える