1

私は単体テストに頭を悩ませていないので。

サービスがあります

public interface IMyService
{
    public List<Person> GetRandomPeople();
}

そして、私のMVCプロジェクトでは、このサービスを実装しています

public MyService : IMyService
{
    public List<Person> GetRandomPeople();
    {
         ...the actual logic the get the People here. This is what i want to test ?
    }
}

次に、私のコントローラーで

public HomeController : Controller
{
     IMyService _myService;
     public HomeController(IMyService myService)
     {
         _myService = myService
     }
}

次に、アクションメソッドで使用します

public ActionResult CreateRandom()
{
    List<Person> people = _myService.GetRandomPeople();
    return View(people)
}

注:人のレポは私のサービスにあり、これをすばやく入力したので、レポがあります。

私の質問: テスト プロジェクトでサービスの実装をテストするにはどうすればよいですか。私は今本当に立ち往生しており、これは私のTDDの将来の「光が点灯する」瞬間になると思います.

前もって感謝します。

4

1 に答える 1

2

サービス インターフェイスをコントローラーに挿入するポイントは、コントローラーを分離してテストできるようにすることです。それをテストするには、モックまたは偽の IMyService を渡します。

サービスの実装方法によっては、統合テストでサービスをテストする必要がある場合があります。これらは単体テストとは別にする必要があります (継続的に実行したくないため)。

たとえば、IMyService が Entity Framework で実装されているとします。データベースに対して LINQ to Entities を実際に実行してテストする必要があります。ローカル データベースを使用することも、EF でその場でデータベースを作成および設定することもできます。これらは単体テストではありません( I/O を使用します) が、それでも重要です。

他の永続化フレームワークでは、メモリ内データ セットに対してテストできる場合があります。それはいいです; 私はまだ統合テスト(あなたのコード+フレームワーク)を考え、それをあなたの単体テストから分離します。

秘訣は、サービスの実装からビジネス ロジックを除外することです。それを(可能な限り)純粋なデータアクセスコードに制限してください。単体テストでビジネス ロジックをテストしたい。

編集:

コメントの質問に対処するには (「スタブを作成する必要がある場合」):

分離してテストしたいクラス (テスト対象のシステム、または SUT) があり、そのクラスに依存関係が注入されている場合、スタブ、フェイク、テスト ダブル、またはモック (多くの用語があります) を作成します。

これらの依存関係は、インターフェイス、抽象クラス、仮想メソッドを持つクラス、デリゲートなど、何らかの形で抽象化されます。

プロダクション コードは具体的な実装を渡します (たとえば、データベースにヒットするクラス)。テスト コードはテスト実装を渡します。

単純なスタブ実装を渡すことができます (インターフェイスを実装し、そのメンバーに固定値を返すダミー クラスをテスト プロジェクトに記述するだけです)。モック オブジェクト)。このすべてを手書きで書くことができます。これは面倒なので、多くのテスターはモック オブジェクト フレームワーク (分離フレームワークとも呼ばれます) を使用します。これらは多数あります (多くの場合、任意の言語で複数あります)。私は .NET でNSubstituteまたはMoqを使用する傾向があります。

テストの書き方を学ぶには時間がかかります。このテーマに関する本を何冊か読んだことは、私を大いに助けてくれました。ブログの投稿では、十分な背景が提供されない場合があります。ここの(残念ながらクローズされた)質問には、いくつかの優れた提案があります。

簡単に言えば、テストで必要なときにスタブまたはモックを作成するということです。

于 2012-08-08T13:15:46.107 に答える