1

Nunit、Ninject、MVC2、および ADO.Net Entity Data Model を使用して、頭を悩ませようとしています。

SqlProductsRepository クラスをインスタンス化する ProductsController があるとします。

public class ProductsRepository : IProductsRepository
{
    public MyDbEntities _context;

    public ProductsRepository()
    {
        _context = new MyDbEntities();
    }

    public IList<Product> GetAllProducts()
    {
        return (from p in _context.Products select p).ToList();
    }
}

public class ProductsController : Controller
{
    public ActionResult ProductsList()
    {
        ProductsRepository r = new ProductsRepository();
        var products = r.GetAllProducts();

        return View(products);
    }
}

ProductsRepository で単体テストを実行して、正しいデータが返されることを確認したいのですが、テスト クラスの記述方法がわかりません。

これまで読んだすべてのチュートリアル/ドキュメントは、IProductsRepository を使用して Mock オブジェクトを作成し、Controller を注入してテストすることを示しています。

これは、具体的な実装をバイパスしているように思えます。

MyDbEntities は、ADO.Net Entity Data Model .edmx から取得されます

4

3 に答える 3

3

あなたは正確に正しいです-リポジトリをモックすることは具体的な実装をバイパスします。それがポイントです。

単体テストは機能テストと同じではありません。モックオブジェクトは、明示的に定義したものを返すように設定できます。次に、モックからの一定の入力が期待される結果につながることを確認するためにテストします。

于 2010-07-15T15:46:43.523 に答える
2

2 つのクラス (ProductsRepository、ProductsController) では、2 つのテスト セットが必要です。クラスごとに 1 セットのテスト。

ProductsController を (ユニット) テストするときは、その依存関係 (この場合は IProductsRepository) をモックする必要があります。依存関係の具体的な実装をバイパスすることがポイントです。

ProductsRepository がデータベースにヒットし、正しいデータを返すことができることを検証するための (統合) テストの完全に異なるセットがあります。これらの統合テストでは、実際のリポジトリと実際のデータベースとの間の相互作用をテストしているため、何もモックしません。

于 2010-07-15T15:50:24.933 に答える
2

単体テストではなく ProductsRepository の統合テストを作成したいようです。これは、データベースに対してテストを行って、正しいデータが得られていることを確認できるようにするためです。

ProductsRepository をモックしたいのは、Controller の単体テストのときです。

ProductsRepository の統合テストでは、次のような明白なことを行います。

public void TestProductsRepository()
{
  var context = new MyDbEntities();

  // add a new product

  var products = context.GetAllProducts();

  // check products contains new product
}
于 2010-07-15T15:44:12.420 に答える