問題タブ [testability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
testability - テスト可能な設計
Facade(Singleton)を使用して作成された静的メンバーを持つJavaクラスがあります。
ここで、クラス A は Web サービス (ステートレス Bean) のメンバー変数として使用されます。
DataStore インスタンスをオーバーライドする方法がないため、EasyMock を使用してこのコードをテストすることはできません。
2 つのオプションがあります。
コンストラクターに、db メンバー変数に設定される DataStore のインスタンスを取得させます。問題は、どのデータストア インスタンスが作成されたかを webservice クラスに認識させたくないことです。
追加の保護された Set メソッドを提供して、db オブジェクトをオーバーライドします。これは、DataStore の Easy Mock オブジェクトを作成し、メンバー変数をオーバーライドする場所で使用したものです。正しい設計か。
他の可能性は何ですか?
c++ - C ++プロジェクトでTDDを実行することは可能/生産的ですか?
C++ プロジェクトで TDD を使用している方がいるかどうか、C# や Java などのマネージ言語と比較して TDD がどのように機能するかを知りたいです。また、C++ プロジェクトのテストを自動化するために、どのフレームワークを使用していますか?
jquery - Request.FormのJSON文字列を使用するコントローラーアクションをテストするにはどうすればよいですか?
ドメインオブジェクトからJSONデータを取得しRequest.Form[0]
、ドメインオブジェクトを呼び出すアクションがあります。
このメソッドをテストしていますが、Request.Formを設定することは不可能のようです。
メソッドを別のメソッドに抽出して、それが返す文字列を取得することもできますが、それは1行のメソッドであり、アクションはまだテストされていません。
$.ajax()
これまたは別の、呼び出しからJSONデータを取得するためのよりテスト可能なメソッドをテストするメソッドはありますか?
c#-4.0 - MEF と工場パターン
テスト容易性を向上させるためにプロジェクトをリファクタリングしようとしています。そのため、抽象ファクトリを導入しています。
私のアプリケーションは、 を使用してさまざまなソースからデータを収集しますICrawlers
。これらICrawler
はサードパーティのライブラリを使用して、Twitter などのさまざまなソースにアクセスします。
例: 私の TwitterCrawler はTweetSharpを使用して Twitter データにアクセスします。
私の最初のバージョンでは、TweetSharp クライアントを Crawler に強力に結合しました。ここで、TweetSharp を aITwitterClient
と a のTweetSharpTwitterClient
実装に抽象化しました。
次のステップは、sを作成するaITwitterClientFactory
を使用して aを導入することです。これにより、テスト出力を提供する を作成するファクトリに切り替えることができるため、目標 (テスト容易性) に近づくはずです。DefaultTwitterClientFactory
TweetSharpTwitterClient
MockTwitterClientFactory
MockTwitterClient
では、本題に入ります。私は依存性注入にMEFを使用しています(しかし、私はそれにかなり慣れていません)。私がやっていることはこれです:
私のDefaultTwitterClientFactory
MEFへのエクスポートに対して:
さて、これはこれまでのところ機能していますが、私の質問は、工場を切り替える方法ですか? 単体テストを作成し、MockClientFactory
代わりに を使用するにはどうすればよいDefaultTwitterClientFactory
ですか?
私のアプローチはまったく良いですか?使用するファクトリを手動で設定した方が良いですか? どこかのような
... new TwitterCrawler(mockedTwitterClientFactory)
あるいは
.... new TwitterCrawler(mockedTwitterClient)
?
これは実際には問題を TwitterClient の外に移動するだけですが、それでもどこかで ITwitterClient を構築する方法と、その目的に使用するファクトリを決定する必要があります。
MEF (ExportProvider?) の仕組みをもっと掘り下げる必要がありますか?
dependency-injection - Windowsクライアント(WPF)アプリケーションで依存性注入を行う適切な方法
私はWebアプリケーションのIoC/DIに慣れています-主にMVC3でNinjectします。私のコントローラーは私のために作成され、すべての依存関係、サブ依存関係などが入力されています。
ただし、シッククライアントアプリケーションでは状況が異なります。独自のオブジェクトを作成するか、サービスロケータースタイルのアプローチに戻して、依存関係のあるオブジェクトを提供するようにカーネルに依頼する必要があります(おそらく、テスト容易性を考慮して、何らかのインターフェイスを介して)。
ただし、ServiceLocatorがアンチパターンとして説明されている場所をいくつか見ました。
だから私の質問は-シッククライアントアプリでNinjectの恩恵を受けたいのなら、これをすべて手に入れるためのより良い/より適切な方法はありますか?
- 妥当性
- 適切なDI/IoC
- 可能な限り最小のカップリング
ここではMVVMについて話しているだけでなく、ビューモデルをビューに取り込むことに注意してください。これは特に、カーネルからリポジトリタイプのオブジェクトを提供し、そのリポジトリからフェッチされたエンティティに機能を注入する必要があることによってトリガーされます(データはもちろんデータベースから取得されますが、状態に応じてパラメータとしていくつかのオブジェクトも必要です世界の、そしてNinjectはそれを提供する方法を知っています)。リポジトリとエンティティの両方をテスト不可能な混乱として残さずに、どういうわけかこれを行うことができますか?
不明な点がありましたらお知らせください。ありがとう!
7月14日編集
提供された2つの答えはおそらく正しいと確信しています。しかし、私の体のすべての繊維はこの変化と戦っています。知識不足が原因の可能性もありますが、このようなやり方の優雅さを理解するのに苦労している具体的な理由も1つあります。
元の質問ではこれについて十分に説明していませんでしたが、いくつかの(最初は4〜5、おそらくもっと後で)WPFクライアントアプリケーションで使用されるライブラリを作成しているということです。これらのアプリケーションはすべて同じドメインモデルなどで動作するため、すべてを1つのライブラリに保持することがDRYを維持する唯一の方法です。ただし、このシステムの顧客が独自のクライアントを作成する可能性もあります。そして、私は彼らに、話しかけるためのシンプルでクリーンなライブラリを用意してもらいたいと思っています。私は彼らにコンポジションルートでDIを使用するように強制したくありません(彼の本でMark Seemanのような用語を使用しています)-それはMyCrazySystemAdapter()を新しくしてそれを使用するだけの場合と比較して非常に複雑になるためです。
ここで、MyCrazySystemAdapter(ここで人々が私に同意しないことを知っているために選択された名前)は、サブコンポーネントで構成され、DIを使用してまとめられる必要があります。MyCrazySystemAdapter自体を注入する必要はありません。これは、クライアントがシステムと通信するために使用する必要がある唯一のインターフェースです。したがって、クライアントは喜んでそれらの1つを取得する必要があり、DIは舞台裏で魔法のように発生し、オブジェクトはベストプラクティスと原則を使用して多くの異なるオブジェクトで構成されます。
これは物事をやりたいという物議を醸す方法になるだろうと私は理解しています。ただし、このAPIのクライアントになる人も知っています。DIシステムを学習して接続し、アプリケーションのエントリポイント(構成ルート)でオブジェクト構造全体を事前に作成する必要があることがわかった場合、単一のオブジェクトを作成する代わりに、中指とデータベースを直接いじって、想像もできないような方法で物事を台無しにしてください。
TL; DR:適切に構造化されたAPIを提供することは、クライアントにとって非常に面倒です。私のAPIは、DIと適切なプラクティスを使用して舞台裏で構築された単一のオブジェクトを提供する必要があります。現実の世界では、パターンや慣習に忠実であり続けるために、すべてを逆方向に構築したいという願望に勝る場合があります。
java - コンストラクター注入を使用してテスト容易性のために構築されたクラスの正しい設計
コードに次の 3 つのレイヤーがあるとします。
1. データベース レイヤー (ORM)
2. ビジネス
ロジック 3. アプリケーション
今、私は次のように私のコードを書きます:
データベース層:
/li>
これには主にデータベースに対する CURD 操作があります。BusinessLogic:
/li>
これは、データベース レイヤーを呼び出して何かを実行するための実際のロジックを保持します。アプリケーション層:
/li>
ビジネス ロジックを呼び出し、データを表示します。
アプリケーション層を見ると、データベース層を認識していますが、これは間違っています。それは知りすぎです。
Misko Heveryのコメント: コンストラクター インジェクションは優れています。しかし、それに従えば、どうすれば抽象化を達成できるでしょうか? ここで Google Guice がどのように役立つのでしょうか?
c# - テスト容易性を向上させるために、破棄可能な依存関係の構築をどこに移動しますか?
単体テストではAssemblyInitialize
、ClassInitialize
やTestInitializeなどを使用してテストを構成します。サービス、作業単位、およびリポジトリを作成するためにいくつAssemblyInitialize
かのシングルトン ファクトリを初期化します (すべてユニティ/依存性注入を使用します)。私のTestInitializeでは、各テストが独立して実行できることを確認するために必要な状態をクリアします。
Stackoverflow を通じて、次の記事に出くわしました。私が書いたいくつかのコードについての考え方が変わったと言わざるを得ませんが、私の心はまだ賑やかです。
たとえば、次のコードを見てください。
次のような aspx ページで使用されます。
以前の記事を念頭に置いて、この種の種類をどのように変更すればよいですか? サービス インスタンスを PrepareView メソッドに渡す必要がありますか? しかし、私の ASPX ページは、サービスや工場などについて知り、使用後にサービスを破棄する必要があります。
Singleton ファクトリはどうすればよいですか? それをクラスのプロパティにして、Unity を介して注入しますか?
php - よりテストしやすいセッション マネージャーの構築
私は一連のコンポーネント (完全なフレームワークになることを願っています) に取り組んでおり、現在、PHP セッションの抽象化を提供するコンポーネントに取り組んでいます。
コードをできる限りテストしやすいものにしようとしていますが、定義上、セッション クラスは $_SESSION スーパーグローバルの形でグローバル状態に依存します。
$ SESSION および session * 関数が 1 か所でのみ呼び出されるようにセッション クラスを実装しようとしましたが、それをテスト目的で PHPUnit でオーバーライドできます。これを行う方法。
テスト可能なセッション クラスを作成するためのより良いアプローチを提案できる場合は、ご意見をお寄せいただければ幸いです。
テストのため、現在の計画では initStorage() を代わりに内部配列をセットアップするだけのメソッドに置き換えることです。あなたがより良いアプローチを提案できるなら、私はそれを聞きたいと思っています。
asp.net-mvc - テスト容易性のために Linq2SQL を抽象化する方法
データ アクセスに Linq2SQL を使用するプロジェクトに取り組んでいます。このプロジェクトは、ASP.NET MVC アプリケーションと 8 つのクラス ライブラリで構成されています。ほとんどのクラス ライブラリには、独自の L2S データ クラスがあります。
私が行っている作業の一環として、テスト対象のさまざまなコンポーネントを取得して、コードベースをクリーンアップする安定性を導入しようとしています。現在、静的クラスとメソッドを多用しており、コントローラーには使用される静的 DataContexts があります。全体を通して。
コントローラーのアクションをテストできるように、L2S の使用をリファクタリングするにはどうすればよいですか?
アプリに依存性注入を導入して他のサービスの一部を切り離しましたが、DataContext とその DataLoadOptions のインスタンス化を制御したいので、DataContext をコントローラーの依存関係プロパティとして使用したくありません。
私が試したことの 1 つは、L2S が生成する部分クラスを利用して DataContext に Interface を追加することでしたが、抽象化がクラス ライブラリにとどまるのではなく、アプリケーションにバブルアップすることがわかりました。それは物事を行う正しい方法とは思えず、維持するのが面倒だと感じました。この方法で成功または失敗した人はいますか?
c# - テスト容易性を評価するC#コードのパーサー?
私は、C# コード ファイルのコレクションを提供し、それらをテスト容易性の問題について分析できるようにするプログラムを作成しようとしています。前のリンクで提供されている 4 つだけから始めています。
最終的な目標は、すべてのファイル、それらが持つ可能性のあるテスト可能性の問題、およびこれらの問題が観察される可能性のある場所に関する特定のコード注釈 (該当する場合) のレポートを作成することです。私が助けてほしいのは、コードの解析作業を簡単にするツールを選択することです。すべてを文字列として読み取ることはできますが、その状況でコードを分析するために順序を決めることは非常に困難です。
これまでに以下の点を評価しました。
- FxCop (.dll 以外では機能しません。いくつかのテスト プロジェクトは、コントローラーまたはプレゼンターにテスト可能なロジックを含む Web プロジェクトです)
- Code Contracts (私が必要とするものではありません。これは問題の特定には役立ちません)
- ペックス(同上)
- NRefactory (興味深いかもしれませんが、Windows に gtk/mono がインストールされていても、ドキュメントと使用法に関する情報が存在せず、デモが壊れています)
- CSharpCodeProvider (.Parse メソッドは NotImplementedException を返します)
私が探している限り:
少なくとも、基本的なオブジェクト構造とアクセサー オブジェクトを検出してナビゲートしたいと考えています (たとえば、FileオブジェクトにはClassesのコレクションを持つNamespaceプロパティがあり、各ClassにはMember、Constructors、およびMethodsなどのコレクションがあります)。明らかに、より精巧で詳細なツールがあればそれは素晴らしいことですが、これらのツールを利用して、小さくて焦点を絞った文字列を処理できるようにすることは、完全な天の恵みです.
前もって感謝します。