3行まとめ
- Atomが使うatom/jasmine-taggedはdescription中の
"#tag-name"
的な文字列をタグとして解釈する - Atomのテストランナーは「
"##{process.platform}"
以外のタグだけを持つテストケース」はSkipするので注意 - 逆に特定のプラットフォームのみで使うテストを書くことが出来る
'#'付きの説明を持つテストが動かない、何故?
Atom上のPluginのテストを書く時に、
↓のようについうっかりRSpecのBetterSpecのノリで、インスタンスメソッドのテストでdescribe '#fuga'
とか書いたテストケースが実行されなくて、「あれ?」って思ったことは無いでしょうか?
class Hoge
@piyo: -> 'it works!'
fuga: -> 'it works?'
describe 'Hoge', ->
describe '.piyo', ->
it 'works', ->
# 成功するテストで実行される
expect(Hoge.piyo()).toBe 'it works!'
describe '#fuga', ->
it 'works', ->
# 失敗するテストだが実行されない
hoge = new Hoge
expect(hoge.fuga()).toBe 'it works!'
上の例だと'Hoge .piyo works'(成功するテストケース)が実行されて、
'Hoge #fuga works'(失敗するテストケース)がSkipされて実行されません。
↑2つ書いたのに1つしか実行されない!
'#'付きの説明書きがタグとして解釈される
apm test
やatom上でのrun spec
でAtomのテストランナーを使ってテストを行う場合、
atom/jasmine-taggedというライブラリも読み込まれています。
実際にソースコードを読むと分かるのですが、
テストを実行する際、まず、atom/jasmine-taggedはテストの説明書き(describe, itの第一引数)を解釈して、「'#'付きの文字列」をタグとして解釈します。
'Hoge .piyo works' # タグを含まない
'Hoge #fuga works' # 'fuga'というタグを持つテストケースになる
これらのテストを実行するとき、atom/jasmine-taggedではタグの情報から、実行するテストケースをフィルタリングします。
Atomのテストランナーは、「OSの識別名
のタグを持つテストケース」と「タグを持たないテストケース」のみを実行する設定になっています。
jasmineEnv = jasmine.getEnv()
jasmineEnv.addReporter(reporter)
jasmineEnv.addReporter(timeReporter)
jasmineEnv.setIncludedTags([process.platform])
$('body').append $$ -> @div id: 'jasmine-content'
jasmineEnv.execute()
(atom/spec/jasmine-helper.coffeeから引用: Atomのテストランナーでテストを実行している部分)
なので、例えばOSXで実行すると「'#darwin'というタグを持つテストケース」か「タグを持たないテストケース」のみを実行するので
'Hoge .piyo works' # タグを含まない → 実行される
'Hoge #fuga works' # 'fuga'というタグを持つ → 実行されない!
ということになり、何故か実行されないテストケースが出てきてしまうわけです。
OS毎のテストの使い分け
↑のことを利用すると↓みたいに特定のプラットフォーム向けのテストを書くことが出来ます。
describe 'process', ->
describe '#darwin', ->
it 'the platform name is darwin', ->
expect(process.platform).toBe('darwin')
describe '#linux', ->
it 'the platform name is linux', ->
expect(process.platform).toBe('linux')