前提
AngularJSでコントローラをネストして階層化すると、子コントローラ側から親コントローラのスコープを利用可能になる。
問題
子コントローラのユニットテストを書こうとした場合に、子コントローラ側で親コントローラのプロパティやメソッドを使用していると、そのままではテストが書けない。
解決
以下のように記述した。
ReportShowCtrlが親コントローラ、CommentNewCtrlが子コントローラ。
comment_new_spec.coffee
"use strict"
describe "Controller: CommentNewCtrl", ->
beforeEach module "myApp"
CommentNewCtrl = {}
scope = {}
Comment = {}
beforeEach inject ($controller, $rootScope) ->
$controller("ReportShowCtrl", {
$scope: $rootScope
report: {id: 1}
})
scope = $rootScope.$new()
CommentNewCtrl = $controller "CommentNewCtrl", {
$scope: scope
}
it "some test", ->
# do something
そもそも論としてネストしたコントローラで、親のプロパティやメソッドが〜、というのは可読性やテスタビリティが下がるのでアレではある。
派生したスコープでのハマリもあるし。