0

単体テストを現在のプロジェクトの設計にどのように結びつけることができるかについて、私は少し迷っています。私の現在のテストはすべて統合テストであり、最終的にはサードパーティの ORM をテストするだけです。リポジトリ パターンを使用する必要があると考えていましたが、それをアプリケーションのレイヤーとして追加する方法が正確にわかりません。例として、私が使用している基本的なオブジェクトを次に示します。

public class Venue : ModelBase<Venue>
{
    public Venue ()
        : base()
    {
    }

    public virtual string VenueName { get; set; }
}

そしてそのアクション:

    [HttpGet]
    public ActionResult Create ()
    {
        return View();
    }

    public ActionResult Create ([ModelBinder(typeof(VenueBinder))]Venue Venue)
    {
        Venue.Save();
        return RedirectToAction("List", "Venue");
    }

    [HttpGet]
    public ActionResult Edit (long id) 
    {
        return View(Venue.Load(id));    
    }

    [HttpPost]
    public ActionResult Edit ([ModelBinder(typeof(VenueBinder))]Venue v, long id)
    {
        VenueBinder.EditModel(v, id);
        return RedirectToAction("List", "Venue");
    }

    public ActionResult Delete (long id)
    {
        Venue temp = Venue.Load(id);
        var eventController = new EventController();
        foreach (var e in Event.All().ToList().FindAll(x => x.Venue.ID == id))
        {
            eventController.Delete(e.ID);
        }
        temp.Delete();
        return RedirectToAction("List", "Venue");

    }       

およびモデル バインダー:

public class VenueBinder : IModelBinder
{
    /// <summary>
    /// bind form data to Venue model
    /// </summary>
    public object BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        return new Venue
        {
            VenueName = bindingContext.ValueProvider.GetValue("name").AttemptedValue
        };
    }

    /// <summary>
    /// edits an existing Venue object
    /// </summary>
    public static void EditModel (Venue v, long id)
    {
        Venue temp = Venue.Load(id);
        temp.VenueName = v.VenueName;
        temp.Save();
    }
}
4

1 に答える 1

1

コントローラーのアクションを単独で単体テストする場合は、コントローラーがコンストラクターの依存関係として受け取るインターフェイスの背後にあるモデルで実行できる CRUD 操作を抽象化する必要があります。単体テスト内で、このインターフェースのモック化されたインスタンスをコントローラーに提供し、期待を定義することができます。

そうは言っても、抽象化が多すぎることは必ずしも良いことではなく、単体テストのためだけに行うべきではありません。たとえば、他のアプリケーションに再利用可能なリポジトリレイヤーがあるなど、サイトに他の価値をもたらさない場合は、おそらくそれを行うべきではありません。統合テストも問題ありません。各テストで予測可能な状態にあるデータ、理想的には各テストの前に入力され、その後に取り壊されたデータでそれを行っていることを確認する必要があるだけです。ORM がこれをサポートしてくれることを願っています。Jimmy Bogard は、抽象化を制限するというテーマで素晴らしいブログ投稿を書きました。

于 2012-10-04T13:40:03.513 に答える