テストでstubを使いすぎる問題
特にJavaScriptのテスト書いたりしてると、局所的にテストするためにsinon.jsのstubを多用するのですが、そうするとstub対象の仕様が変わった時にもテストがfailしなくなるので使い過ぎには注意しないとなぁと自分のテストコード見てて思いました。
コードにするとこんなイメージ
# Viewの実装 TestView = Backbone.View.extend : testMethod: (args) -> results = @model.veryComplexMethod args.value @render result: results[0] # テスト describe "testMethod", -> view = null beforeEach -> view = new TestView model: new TestModel() sinon.stub(view.model, "veryComplexMethod").returns ["return value"] sinon.stub view, "render" view.testMethod value: "test input" afterEach -> view.model.veryComplexMethod.restore() view.render.restore() it "should call model.veryComplexMethod with args.value", -> expect(view.model.veryComplexMethod.calledOnce).to.be.ok() expect(view.model.veryComplexMethod.args[0][0]).to.be "test input" it "should render with model.veryComplexMethod return", -> expect(view.render.calledOnce).to.be.ok() expect(view.render.args[0][0]).to.be.eql result: "return value"
- model.veryComplexMethodの処理がHTTPリクエスト投げていたり、動作させるための準備が面倒なのでとstubにした場合、model.veryComplexMethodが返り値を配列から文字列に仕様を変えた時にもこのテストは通り続けます。
- このコード自体は意図したとおりに動いているのですが、出来ればテストがfailしてほしいところです。
- 他にはFakeServerを使った場合なども実際のAPIの仕様が変わってもテストがfailしなくなりますが、それは単体テストの範囲でないなぁと思ったりしていて、どれをstubとするのかが考えだすと難しいなぁと思ったりしています。
- なるべくstub対象が局所的になるようにとは思っていますが、つい簡単にテストを書くためにテスト対象のコード以外の部分をガツッとstubにしてしまうことがあるので注意しないとなと思っています...。