5

RavenDBを使い始めたばかりで、今のところ気に入っています。しかし、私はそれと相互作用するコントローラーアクションをユニットテストする方法に固執しています。

私が見つけたすべての質問/記事は次のようになっています。RavenDbクエリのユニットテストでは、RavenDBをモックするのではなく、メモリ内で使用する必要があると言われていますが、これがどのように行われるかについての確かな例は見つかりません。

たとえば、データベースに従業員を追加するコントローラーアクションがあります(はい、それは過度に単純化されていますが、問題を複雑にしたくありません)

public class EmployeesController : Controller
{

  IDocumentStore _documentStore;
  private IDocumentSession _session;

  public EmployeesController(IDocumentStore documentStore)
  {
    this._documentStore = documentStore;

  }

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    _session = _documentStore.OpenSession("StaffDirectory");
  }

  protected override void OnActionExecuted(ActionExecutedContext filterContext)
  {
      if (_session != null && filterContext.Exception == null) {
        _session.SaveChanges();
        _session.Dispose();
    }
  }

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

  [HttpPost]
  public RedirectToRouteResult Create(Employee emp)
  {
    ValidateModel(emp);
    _session.Store(emp);
    return RedirectToAction("Index");
  }

単体テストでデータベースに何が追加されたかを確認するにはどうすればよいですか?MVCアプリケーションでRavenDbを使用する単体テストの例はありますか?

それが重要な場合はMSTestを使用していますが、他のフレームワークからテストを変換してみてうれしいです。

ありがとう。

編集

テストの初期化により、コントローラーコンストラクターに挿入されるドキュメントストアが作成されますが、テストを実行するとOnActionExecutingイベントが実行されないため、使用するセッションがなく、null参照例外でテストが失敗します。

[TestClass]
public class EmployeesControllerTests
{
  IDocumentStore _store;

  [TestInitialize]
  public void InitialiseTest()
  {
    _store = new EmbeddableDocumentStore
    {
      RunInMemory = true
    };
    _store.Initialize();
  }

  [TestMethod]
  public void CreateInsertsANewEmployeeIntoTheDocumentStore()
  {
    Employee newEmp = new Employee() { FirstName = "Test", Surname = "User" };

    var target = new EmployeesController(_store);
    ControllerUtilities.SetUpControllerContext(target, "testUser", "Test User", null);

    RedirectToRouteResult actual = target.Create(newEmp);
    Assert.AreEqual("Index", actual.RouteName);

    // verify employee was successfully added to the database.
  }
}

私は何が欠けていますか?テストで使用するためにセッションを作成するにはどうすればよいですか?

4

3 に答える 3

7

単体テストを実行したら、データベースに新しいドキュメントがあり、適切なフィールドが設定されていることを表明します。

var newDoc = session.Load<T>(docId)

また

var docs = session.Query<T>.Where(....).ToList();

RavenDBのメモリ内モードがあるため、モックアウトする必要はありません。次の手順を実行するだけです。

  • 新しいメモリ内の埋め込みドキュメントストアを開きます(データなし)
  • 必要に応じて、単体テストを実行するために必要なデータを挿入します
  • 単体テストを実行します
  • インメモリストアのデータを見て、正しく更新されているかどうかを確認します

更新完全なサンプルが必要な場合は、RacoonBlogコードがどのように機能するかを確認してください。これは、Ayendeのブログを実行しているコードです。次の2つのファイルを参照してください。

于 2012-05-02T22:34:12.977 に答える
3

単体テストでデータベースに何が追加されたかを確認するにはどうすればよいですか?

あなたはそうしない。ユニットテストではそのようなことはテストしません。これは統合テストの責任であり、単体テストではありません。

外部ソース(データベースなど)に依存するテストクラスを単体テストする場合は、データベースアクセスをモックします。

編集:

言及されたいくつかの間違いを修正するために、MSDNからの定義を引用します(ただし、他のすべてのリソースはそれに同意します)。

単体テストの主な目標は、アプリケーション内のテスト可能なソフトウェアの最小部分を取得し、それを残りのコードから分離して、期待どおりに動作するかどうかを判断することです。

嘲笑することなく、ユニットテストの基本原則を無視しています-可能な限り最小のピースを分離してテストします。ユニットテストは永続的である必要があります-無知であり、外部クラスに依存するべきではありません。データベースが時間の経過とともに変化した場合はどうなりますか?機能はまったく同じですが、すべてのテストを書き直しますか?

来て。あなたは私にあなたが望む回数-1を与えることができます、しかしそれはあなたを正しくしません。

于 2012-05-02T22:00:05.920 に答える
1

上記のリンク先のスレッドは、RavenDBを埋め込んでEmbeddableDocumentStoreを使用します。

設定方法は次のとおりです:http: //msdn.microsoft.com/en-us/magazine/hh547101.aspx

簡単にテストできるように、ravenでリポジトリパターンを使用する方法は次のとおりです。http: //novuscraft.com/blog/ravendb-and-the-repository-pattern

于 2012-05-02T21:50:30.820 に答える