LoginSignup
4
2

More than 5 years have passed since last update.

Atomのテストの"#"付きのdescriptionはタグとして解釈される

Last updated at Posted at 2014-09-21

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されて実行されません。

スクリーンショット 2014-09-21 13.50.57.png

↑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')
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2