ホームページ  >  記事  >  バックエンド開発  >  テスト構造を反復するときにerrors.As()を使用すると、2番目のパラメータがerrors.Asに*errorであってはなりません。

テスト構造を反復するときにerrors.As()を使用すると、2番目のパラメータがerrors.Asに*errorであってはなりません。

PHPz
PHPz転載
2024-02-15 14:06:07486ブラウズ

在迭代测试结构时使用errors.As(),将第二个参数返回给errors.As 不应该是*error

php エディター Strawberry は、テスト構造を反復中にエラーを見つけました。 error.As() を使用すると、errors.As に返される 2 番目のパラメータは、エラーではなくエラーへのポインタである必要があります。このエラーにより、プログラムが予期せぬ動作や不正な動作をする可能性があります。したがって、errors.As() を使用する場合は、パラメーターの型に注意し、問題の発生を避けるためにエラーへのポインターが渡されるようにしてください。この問題はテスト構造を反復処理するときに発生する可能性があるため、errors.As() を使用する場合は特に注意してください。

質問内容

現在、関数が複数の種類のエラーを返す可能性があるパッケージの単体テストをいくつか書いています。構造を次のように定義します:

リーリー

そして、errors.as() を使用して、テストのエラーで test.err を見つけたいと考えています。テストで使用した構造例は次のとおりです:

リーリー

エラー インターフェイスを実装する 異なる 構造体タイプに errors.as を使用したいと考えています。したがって、構造からわかるように、err をエラーとして定義します。ご覧のとおり、エラー インターフェースを実装する &url.error{} を使用しています。

リーリー

ただし、上記のように errors.as を使用すると、

が返されます。 リーリー

私が理解しているところによると、errors.as() は any を 2 番目の引数として受け入れます。そのため、なぜ *error を使用できないのか混乱しています。

また、テスト構造の err フィールドを Interface{} に変更しようとしましたが、これにより、ターゲットがエラーに存在するかどうかに関係なく、すべてのアサーションが通過してしまいました。

上記と同様の方法でエラー インターフェイスを実装する別の種類のソリューションを実現する errors.as() の使用方法が見つからないため、今は の使用に頼っています。代わりに contains() が含まれます。誰かが洞察を提供できるかどうか疑問に思っています。

解決策

エラー型へのポインタが error インターフェイスを満たしていないため、as の 2 番目のパラメーターは # 型になります。 # #どれでも###。必要な型を .err フィールドに直接保存するには、フィールドの型も any である必要があります。 ただし、このポインタ値をインターフェイスでラップしているため、検査用の値を取得するには、型アサーションまたはリフレクションを使用する必要があります。 リーリー

以上がテスト構造を反復するときにerrors.As()を使用すると、2番目のパラメータがerrors.Asに*errorであってはなりません。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。