ASP.NET MVC, RavenDb и модульное тестирование

Я только начинаю работать с 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");
  }

Как я могу проверить, что было добавлено в базу данных в модульный тест? Есть ли у кого-нибудь примеры модульных тестов с использованием RavenDb в приложениях MVC?

Если это имеет значение, я использую MSTest, но с удовольствием попробую перевести тесты из других фреймворков.

Спасибо.

РЕДАКТИРОВАТЬ

Хорошо, инициализация моего теста создает хранилище документов, которое вводится в конструктор контроллера, но когда я запускаю свой тест, событие OnActionExecuting не запускается, поэтому нет сеанса для использования, и тест завершается с ошибкой исключение нулевой ссылки.

[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.
  }
}

Что я упускаю? Как создать сеанс для использования в тесте?

5
задан Community 23 May 2017 в 12:09
поделиться