9

私は StatefulWidget (それを呼び出すMyWidget) を持っています。その State ( ) には、次のように初期化されるMyWidgetStateフィールドがあります。myDatainitState()

void initState() {
    super.initState();
    myData = new myData(config.someField.getId());
}

ユーザーがボタンを押すと、myData がグローバル リストに追加またはグローバル リストから削除されます。

この動作をテストする単体テストを作成しようとしていますが、MyWidgetState にアクセスする方法がわかりません。これを setup() に含めてみました:

widget = MyWidget();
widgetState = widget.createState(); 
widgetState.init();

しかし、initState() を試みるたびにクラッシュし、「someField が null で呼び出された」と不平を言います。それはいいです。私はおそらくそのようにしようとして不正行為をしていたので、WidgetBuilder で何かを行うか、MyWidget を使用してアプリケーションを起動し、適切にインスタンス化されたらツリーで MyWidget を見つける必要があります。

そのすべてを行った場合、その MyWidget の MyWidgetState にアクセスして myData のコピーを取得し、それをグローバル リストと比較するにはどうすればよいでしょうか?

4

4 に答える 4

1

コード スニペットを使用して Flutter でステートフル ウィジェットを作成すると、Flutter によって作成された状態クラスが、最初にアンダースコアで作成されたプライベート クラスであることに気付いたかもしれません。そのようなクラスはライブラリの外で使用されることを意図していないため、これは良いことです-まあ、テストを除いて。

ウィジェット/統合テストでは、状態クラスの変数にアクセスしたい場合があります。このような場合、状態クラスをプライベートとしてマークすると、それらの変数に直接アクセスできなくなります。これは望ましくない場合があります。@visibleForTesting両方の長所を活かすために、デコレータを使用できます。

以下に例を示します。

import 'dart:math';
import 'package:flutter/material.dart';

class CounterWidget extends StatefulWidget {
  const CounterWidget({Key key}) : super(key: key);

  @override
  CounterWidgetState createState() => CounterWidgetState();
}

@visibleForTesting
class CounterWidgetState extends State<CounterWidget> {
  int counter;
  @override
  void initState() {
    super.initState();
    var rndGen = Random(79);
    counter = rndGen.nextInt(96);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        child: ElevatedButton(
            key: Key('incrementButton'),
            onPressed: () {
              setState(() {
                counter++;
              });
            },
            child: Text(
              'Increment($counter)',
            )));
  }
}

のドキュメントは@visibleForTesting言う

公開された宣言に注釈を付けて、コードをテスト可能にするために必要以上に見やすくするために使用されます。

アナライザーなどのツールは、次の場合にフィードバックを提供できます。

注釈が、パッケージの lib フォルダーにない宣言、private 宣言、または名前のない静的拡張機能の宣言に関連付けられているか、宣言がその定義ライブラリまたはの test フォルダーにあるライブラリの外部で参照されています。定義パッケージ。

ここで重要なことは、Flutter 設計ではめったに必要とされない、ライブラリまたはテストの外部で公開状態クラスを使用すると、Dart アナライザーが警告することです。

使用のアイデアはここvisibleForTestingから来ました

于 2021-07-03T21:13:03.940 に答える