35

ダーツ ファイルでプライベート関数を定義したとしますhello.dart

_hello() {
  return "world";
}

別のファイルでテストしたいmytest.dart

library mytest;

import 'dart:unittest/unittest.dart';

main() {
  test('test private functions', () {
    expect(_hello(), equals("world"));
  }
}

残念ながら、テスト コードはコンパイルできません。_helloしかし、そのプライベート機能をテストする必要があります。解決策はありますか?

4

3 に答える 3

17

一部の人々は、private を直接テストするべきではないと考えています。public インターフェースを介してテストする必要があります。

このガイダンスに従う利点は、テストが実装に依存しないことです。別の言い方をすれば、世界に公開するものを変更せずにプライベートを変更したい場合は、テストに触れる必要はありません。

しかし、この学派によれば、プライベートが単体テストを正当化するのに十分重要である場合、新しいクラスでそれを抽出することは理にかなっているかもしれません。

これらすべてをまとめると、ここでできることは次のようになります。

  • helloこのメソッドを public として一種のヘルパー クラスを作成します。その後、簡単に単体テストできます
  • 現在のクラスでこのヘルパー クラスのインスタンスを使用できるようにする
  • に依存する現在のクラスのパブリック メソッドをテストします_hello。このプライベートにバグがある場合は、それらのより高いレベルのテストでキャッチする必要があります。
于 2014-02-09T09:30:42.597 に答える
2

メソッド/クラスを非公開にするのではなく、実装の詳細を隠したいコードを lib/src フォルダーに移動することをお勧めします。このフォルダはプライベートと見なされます。 このアプローチは、このセクションの「テスト」の下
の fuchsia.dev ページで見つけました。

src フォルダーにあるこれらのプライベート メソッド/クラスをパブリックに公開する場合は、それらを lib/main ファイル内にエクスポートできます。

ライブラリ A (プロジェクトはライブラリ) の 1 つを別のライブラリ B にインポートしようとしましたが、ライブラリ A の src フォルダーにあるコードをインポートできませんでした。このStackOverflow の回答によると、図書館 B の A.

ダーツのドキュメントから

ご想像のとおり、ライブラリ コードは lib ディレクトリの下にあり、他のパッケージに公開されています。必要に応じて、lib の下に任意の階層を作成できます。慣例により、実装コードは lib/src の下に配置されます。lib/src の下のコードは非公開と見なされます。他のパッケージは src/... をインポートする必要はありません。lib/src の下の API を公開するには、lib の直下にあるファイルから lib/src ファイルをエクスポートできます。

于 2021-03-17T15:25:25.933 に答える