こんにちは、しきゆらです。
今回はRSpecで特定の場合だけ動く・動かないようなテストを書く方法を知ったのでメモしておきます。
やりたいこと
ログイン周りのテストをCIで実行したくない
書いていたコードとしては、Seleniumを使ってWebサービスのテストを書いていました。
諸々のテストはいいんですが、ログイン周りのテストは2段階認証などがあるため、Waitをかけて人の手で操作していました。
このRSpecをCI上で動かそうとしたとき、ログイン周りだけは止めたい!
というのが一番初めにあったやりたいことでした。
特定のクラスを継承している場合は実行したくない
合わせて、コードの中で特定のクラスを継承している場合のみこのテストを実行したい、ということもありました。
RSpecはテストを共通化する仕組みがあるので、それを使ってテストコードを共通化していたのですが
一部共通化していたテストの中で、ちょっとまずい事態が出てきました。
上記に関連してSelenium周りなんですが、Seleniumを使うクラスとSeleniumを使わないクラスが出てきたことで共通化していたテストの一部がSeleniumを使わないクラスでは必要なくなるということが起きました。
共通化していた部分を分けてSelenium用の共通コードとSelenium使わないクラスの共通コードに分ければいいんでしょうが、両方とも分類的には同じくくりなので名前を分けるだけだと、名前が似てしまってごちゃっとしてしまいそうでした。
これを回避するために、共通化しているSpec側で実行されているクラスを判定して、必要ない場合は実行しないような世界を作りたかったんです。
こちらも併せて方法が分かったのでメモしておきます。