[解決済み] ファイルシステムに依存するコードの単体テスト
質問
私は、ZIPファイルが与えられると、それが必要なコンポーネントを書いています。
- ファイルを解凍します。
- 解凍されたファイルの中から特定のDLLを検索します。
- リフレクションによってそのDLLをロードし、そのDLL上のメソッドを呼び出す。
このコンポーネントをユニットテストしたいのですが。
ファイルシステムを直接処理するコードを書きたくなった。
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
しかし、「ファイルシステム、データベース、ネットワークなどに依存するユニットテストは書くな」とよく言われます。
これをユニットテストに適した形で書くとしたら、こんな感じになるんでしょうかね。
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
やったー これでテストが可能になりました。DoItメソッドにテスト用のダブル(モック)を送り込めばいいのです。しかし、その代償は?これをテスト可能にするために、3つの新しいインターフェイスを定義しなければならなくなったのです。そして、私は何をテストしているのでしょうか?DoIt関数が依存関係にある関数と適切に相互作用することをテストしているのです。zip ファイルが正しく解凍されたかどうかなどはテストしていません。
もう、機能をテストしている感覚はないですね。ただクラスのインタラクションをテストしているようにしか感じられない。
私の疑問はこれ : ファイルシステムに依存するものをユニットテストする適切な方法は何でしょうか?
編集 私は.NETを使用していますが、コンセプトはJavaやネイティブコードにも適用できます。
どのように解決するのですか?
これは本当に何も問題ありません。ただ、これをユニットテストと呼ぶか、統合テストと呼ぶかが問題なのです。 ただ、ファイルシステムとやりとりするときに、意図しない副作用がないことを確認する必要があります。 特に、作成した一時ファイルを削除するなどの後始末をしっかり行い、たまたま使っていた一時ファイルと同じファイル名の既存のファイルを誤って上書きしないようにしましょう。 また、絶対パスではなく、必ず相対パスを使用してください。
また、以下のようにするとよいでしょう。
chdir()
をテスト実行前に一時ディレクトリにコピーし
chdir()
を返します。
関連
-
[解決済み】Javaプロジェクト。ApplicationContextのロードに失敗しました
-
[解決済み] Moqでクラスをモックするとき、特定のメソッドだけをCallBaseする方法は?
-
[解決済み] ユニットテストの命名のベストプラクティス [終了しました]。
-
[解決済み] ユニットテストは努力に値するか?[クローズド]
-
[解決済み] C# "internal "アクセス修飾子でユニットテストを行う場合
-
[解決済み] モックオブジェクトは何のためにあるのか?
-
[解決済み] Goのモック関数
-
[解決済み] Visual Studio 2015または2017でユニットテストが検出されない
-
[解決済み] ユニットテストプロジェクトは、ターゲットアプリケーションのapp.configファイルを読み込むことができますか?
-
[解決済み] Go の testing パッケージを使用してテストのセットアップを行うにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] フェイク、モッキング、スタビングの違いとは?
-
[解決済み] ユニットテストは努力に値するか?[クローズド]
-
[解決済み] NUnit vs. MbUnit vs. MSTest vs. xUnit.net [終了しました。]
-
[解決済み】ユニットテストと機能テストの違いは何ですか?
-
[解決済み】ユニットテスト初心者、優れたテストを書くには?[クローズド]
-
[解決済み] JUnitを使ったユニットテストのためのIntelliJ IDEAの設定
-
[解決済み] ユニットテストはゲッターとセッターのために書くべきですか?
-
[解決済み] 既存のプロダクションプロジェクトにユニットテストをうまく追加することができますか?もしそうなら、どのように、そして、それは価値があるのでしょうか?
-
[解決済み] Go の testing パッケージを使用してテストのセットアップを行うにはどうすればよいですか?
-
[解決済み] Junit: 統合テストと単体テストの分割