0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flutter/Dartプロジェクトのテストファイルはtestフォルダに置くこと

Last updated at Posted at 2024-06-09

簡単にまとめると?

  • テスト用のパッケージを import 'package:test/test.dart' した時に depend_on_referenced_packaeges というエラーが出た
  • 要約すると 「dev_dependenciesにあるパッケージをimportする場合はlibなどに置かない」ということ
  • つまり Flutter/Dart のテストファイルはtestフォルダに置こう!

背景

FlutterやDartでのTDDをやってみるためにTDD本をDartで実装することにした。

Dartプロジェクトを dart create tdd_project みたいな感じで作った。
テストを書きたかったので pubspec.yaml の dev_dependencies に test: ^1.25.7 を追加した。
早速テストを実装したところ import 'package:test/test.dart'; の部分で以下のようなエラーが出た。

The imported package 'test' isn't a dependency of the importing package.
Try adding a dependency for 'test' in the 'pubspec.yaml' file. dart depend_on_referenced_packaeges

どんなエラー?

このエラーを率直に翻訳すると、以下のようになる

インポートされたパッケージ 'test' は、インポートするパッケージの依存関係ではありません。
pubspec.yaml' ファイルに 'test' の依存関係を追加してみてください。

???????

testパッケージはpubspec.yamlのdev_dependenciesに追加されてるけどどういうこと?
さらに公式ドキュメントから深掘りしてみると、以下の部分が引っかかった。

Whether this should be a regular dependency or dev_dependency depends on if it is referenced from a public file (one under either lib or bin), or some other private file.
(訳:これが通常の依存関係であるべきかdev_dependencyであるべきかは、それがパブリックファイル(libまたはbin配下のファイル)から参照されるのか、その他のプライベートファイルから参照されるのかによって決まる。)

なるほど、原因はプロジェクトのフォルダ構造にあった。
プロジェクトのフォルダ構成は、以下のようになっている

.
├── .dart_tool
│   └── package_config.json
├── .vscode
│   └── launch.json
├── bin
│   ├── money_test.dart
│   └── money.dart
├── .gitignore
├── analysis_options.yaml
├── CHANGELOG.md
├── pubspec.lock
├── pubspec.yaml
├── README.md
└── todo.md

ここで注目してほしいのがbinフォルダにテストファイルが置かれていること。
テストファイルがimportするtestパッケージはdev_dependenciesに依存関係が記述されている。一方、binフォルダ配下にあるファイルはパブリックファイルでありdev_dependenciesの依存関係を参照するべきでない。ということである。これは上記のエラーメッセージから読み取れる範囲内での話だ。

なぜdev_dependenciesをbinフォルダないから呼び出してはいけないか。

Flutter/Dartでをpubspec.yamlを記述するとき、dependenciesかdev_dependenciesかのどちらかに分けられる。これらの違いを認識していれば、上記のような問題の背景を理解することができる。絶対にダメというわけではないがFlutter/Dartのお作法として従っておいた方がいい内容である。

dependenciesとdev_dependenciesの違いはざっくりと以下の通りである。

  • dependencies
    • lib や bin ディレクトリからインポートされる場合に使用する
    • パッケージが依存するパッケージとそのすべての依存関係を取得する
  • dev_dependencies
    • test、example、などのディレクトリからのみインポートされる場合に使用する
    • パッケージの開発に必要なパッケージを指定するが、依存するパッケージの dev_dependencies は無視される

詳しくは公式ドキュメントを確認してほしい。

まとめ

再掲になるが、要点をまとめると以下の通り。

  • テスト用のパッケージを import 'package:test/test.dart' した時に depend_on_referenced_packaeges というエラーが出た
  • 要約すると 「dev_dependenciesにあるパッケージをimportする場合はlibなどに置かない」ということ
  • つまり Flutter/Dart のテストファイルはtestフォルダに置こう!

これまでの内容がわかると当たり前のようだが、他のフレームワークだと一般用途と開発用途との依存関係の区別があっても、importのされ方まで区別する必要がなかったので、今回調べてみて勉強になった気がする。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?