Go での定数のテスト
Go では、定数はコードの一貫性と正確性を確保するための貴重なツールです。ただし、単体テストに関しては、定数を使用すると問題が発生する可能性があります。この記事では、Go で特にテスト目的で定数を再定義する方法について説明します。
定数への挑戦
Go の定数は不変の値であり、プログラムの実行中に変更することはできません。この不変性により、プログラムの状態の整合性が確保され、偶発的な変更が防止されます。ただし、テスト中に、特定のシナリオをテストするために定数を一時的に変更することが必要になる場合があります。
テストに優しいアプローチ
次の例を考えてみましょう:
package main
const baseUrl = "http://google.com"
// in main_test.go
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
...
}))
const baseUrl = ts.URL // Error: const baseUrl already defined
この例では、テストのためにリモート API を呼び出すのではなく、テスト サーバーを使用したいと考えています。これを行うには、baseUrl をテスト サーバーの URL で再定義する必要があります。ただし、定数baseUrlがすでに定義されているため、Goはエラーをスローします。
解決策: テスト容易性のためのリファクタリング
テストを容易にするために、次のようにコードをわずかにリファクタリングできます。追加関数:
const baseUrl_ = "http://google.com"
func MyFunc() string {
// Call other function passing the const value
return myFuncImpl(baseUrl_)
}
func myFuncImpl(baseUrl string) string {
// use baseUrl
// Same implementation that was in your original MyFunc() function
}
このリファクタリングされたコードでは、元の MyFunc 関数は、baseUrl パラメーターを受け取る myFuncImpl にその実装を委任します。これにより、テスト関数から直接 myFuncImpl を呼び出し、任意のベース URL を渡すことができます。
運用コードの安全性の維持
元の MyFunc 関数は安全なままであり、影響を受けません。リファクタリング。常に定数baseUrl_をmyFuncImplに渡し、定数の変更によって製品コードが予期せぬ動作をしないようにします。
結論
この手法を使用すると、開発者は定数を再定義できます。実稼働コードの整合性と安全性を維持しながら、テスト目的で使用できます。元の関数と同じ機能を提供する追加関数を導入することにより、テストでは実際のコードの動作に影響を与えることなく定数を変更できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3