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 と呼ばれるらしい。参考リンク)