私はApress ASP.NET MVC 3 bookに行って、可能な限りユニットテストを確実に作成しようとしていますが、なぜ編集が保存されないのかを試してみるとよいでしょう(this SO question参照)私はこれのための単体テストを作りたがっていました。ユニットテスト可能なクラスを設計する
私は次のクラスのための単体テストを作成する必要が出てきました:
public class EFProductRepository : IProductRepository {
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products {
get { return context.Products; }
}
public void SaveProduct(Product product) {
if (product.ProductID == 0) {
context.Products.Add(product);
}
context.SaveChanges();
}
public void DeleteProduct(Product product) {
context.Products.Remove(product);
context.SaveChanges();
}
}
public class EFDbContext : DbContext {
public DbSet<Product> Products { get; set; }
}
私はNinject.MVC3と部品番号を使用していますし、仕事をしながら前述したものの(前に、いくつかのユニットテストを作成しました本)ゆっくりと私の頭の周りを取得しています。私はすでに(うまくいけば正しく)_context
に渡すために私を可能にするために、コンストラクタメソッドを作成しました:
public class EFProductRepository : IProductRepository {
private EFDbContext _context;
// constructor
public EFProductRepository(EFDbContext context) {
_context = context;
}
public IQueryable<Product> Products {
get { return _context.Products; }
}
public void SaveProduct(Product product) {
if (product.ProductID == 0) {
_context.Products.Add(product);
} else {
_context.Entry(product).State = EntityState.Modified;
}
_context.SaveChanges();
}
public void DeleteProduct(Product product) {
_context.Products.Remove(product);
_context.SaveChanges();
}
}
をしかし、これは私が悩みを持って始めるところ...私は私が(参照EFDbContext
のためのインタフェースを作成する必要があると信じています以下)ので、私はテストのための模擬レポでそれを置き換えることができますが、それはクラスDbContext
上に構築されています:System.Data.Entity
から
public class EFDbContext : DbContext {
public DbSet<Product> Products { get; set; }
}
と私は私の人生のためのインターフェイスを作成する方法を考え出すことはできませんそれは...私は次のインターフェイスを作成する場合は、メソッドの不足のためにエラーが発生しますクラスからであり、それはクラスではないインターフェイスだとして `EFDbContextが...
using System;
using System.Data.Entity;
using SportsStore.Domain.Entities;
namespace SportsStore.Domain.Concrete {
interface IEFDbContext {
DbSet<Product> Products { get; set; }
}
}
元のソースから得たことができているように、私は「DbContext」を使用してインターフェイスを構築することはできませんthis pageの "ソースコード/ダウンロード"のencase私は上記のコードの断片で何かが見逃してしまった(または単に質問して追加します)。
私は理解しているものの限界にぶつかっていますし、検索したり読んだりすることもできません。私はこれをどのように過ぎ去ったのか分かりません。 助けてください!
私は(または少なくとも本は持っている)IProductRepositoryの単体テストをすでに持っていて、アプリケーションがセーブを管理する方法をテストしますが、EFProductRepostioryが動作することを確認するレベルには達しませんでした(そして本の例私はそれに何かを加えたいと思っていました。データがdbに保存されているかどうかテストするのは別のレベルのテストが好きなようですが、私は擬似レポを使用していないのであればこれを正しく実行する方法はわかりませんスクリプトを作成する/データベースを拭く...そのレベルのテストは正常ですか?それはMySQLではなく、アプリをテストしているのですか? – GazB
@ Zasurus:データベース層が動作するかどうかのテストは、* integration *または* system * testingに該当する重要なステップです。ユニットテストができないことをシステムテストが捉えることができる多くの問題があります(悪いデータベース接続文字列、データベーススキーマと同期していないEFモデルなど)。一方で、あなたのリポジトリコードはとてもシンプルであるように見えますが、単体テストでは、実際にエラーが発生する可能性はほとんどなく、メンテナンスオーバーヘッドが増えていると主張しています(Joel Spolsky) – StriplingWarrior
それはそのアプリケーションのための唯一のテーブルなので、私はそれがシンプルだが、プロジェクトの目的はそれが今までに生きているアプリケーションではないことを学ぶことです。私は生き生きとするアプリケーションの始まりを作ることを学んだものを使用していますが。うまくいけば、まあまあのサイズに成長し、私は本当に私はそれを実際のものに適用することができますので、私は少なくとも、このアプリでこれらを行う正しい方法の周りに私の頭を得るためにしたいと思います。 :)ライブアプリの現在のバージョンは150台以上です(したがって、MVCでの書き換えが混乱しています)ので、ユニットテストが役立つと確信しています!まもなく上記を試します。 – GazB