85329


テストの仕方についての質問です。

Hombrewでパッケージをインストールする時に、事前に依存環境を含めてどういうパッケージが同時にインストールされるかを調べるスクリプトをrubyで作っていて(Homebrew自体にそういった機能があるかもしれませんが、rubyの勉強のために作っています)、実行環境に左右されないようなテストの書き方がわかりません。

スクリプトの実行イメージは  
`$ ruby app.rb A`  
と打つと、Aというパッケージをhomebrewでインストールする時に、未インストールの依存パッケージにどういうものがあるかを配列で返します。  
例えば、AにはBとCとDという依存パッケージがあり、自分の環境にはすでにCがインストールされている場合、  
`["B", "D"]`  
が返ってくるというイメージです。

テストはminitestでもRSpecを使っても構わないのですが、どういうテストをすれば良いでしょうか？  
やりたいテストケースは

  * Aをインストールする -> Cはすでにインストール済み -> `["B", "D"]`が返る
  * Aをインストールする -> 何もインストールされてない -> `["B", "C", "D"]`が返る  
というのを想定しています。

テストファイルに返り値をハードコードしてしまうと、実行する環境によってテスト結果が異なってしまうので、どんな環境でも正確にテストするにはどのようにテストを書けば良いでしょうか？


CC BY-SA 4.0
2021-12-24T05:16:19.580
85318
2021-12-25T17:52:36.213
192
question
ruby rspec テスト
実行する環境に依存しないテストの書き方について


いわゆるMOCKを使うべきテストですね。  
ここでの問題は、テストに返り値をハードコードすることではなく、テストの結果が実際にモジュールがインストールされているかどうかで変わること。  
つまり、テストの結果がテストの外の環境に依存していることが問題です。

RubyのBDD/TDD環境についてはよく分からないので考え方だけですが、今回の場合はモジュールの存在チェックするクラスを別にして、その部分にモックを使います。  
質問の例で言えば、既にインストールされているモジュールを["C"]のような配列でモックに渡します。  
RSpecなりでテストする場合は、モック側で配列にあるモジュールならインストール済みと判断するわけです。  
配列などの初期化はモック作成時の引数にし、複数のシナリオに会わせて最適なモックのインスタンスを作成する形にすれば良いでしょう


CC BY-SA 4.0
2021-12-25T17:52:36.213
85329
2021-12-25T17:52:36.213
44341
85318
answer