@kyanny's blog

My thoughts, my life. Views/opinions are my own.

window.location は stub できない

JavaScript の window.location は read-only プロパティなので上書きできず、したがって Sinon.JS でスタブすることもできない。知らなかった。

Window.location - Web API Interfaces | MDN

The Window.location read-only property returns a Location object with information about the current location of the document.

Mocha とかを使ってブラウザでテストを走らせる場合、 window.location.reload() とかが実行されるコードパスを通ると test.html 的なページが延々リフレッシュされ、永遠にテストが終わらない。

そういう場合は window.location.reload() を呼び出すだけのラッパー関数を定義して、ラッパー関数を Sinon.JS でスタブすれば無限ループを防いでテスト可能。たぶんこんな感じ。

class Foo
  run: ->
    @reload()
  reload: ->
    window.location.reload()

describe "Foo", ->
  describe "run", ->
    it "reloads page", ->
      foo = new Foo
      sinon.stub(foo, 'reload')
      foo.run()
      expect(foo.reload).to.have.been.calledOnce
      foo.reload.restore()

一方で window.open はそういう制限はなく自由に上書きできる(関数以外の値も代入可能)。どのプロパティが上書き不可なのかは調べて覚えるしかなさそう(そういうオブジェクトは host object と呼ばれるらしい。参考リンク