2010-06-09 5 views
3

Я немного не уверен в том, как управлять сессиями в моих измерительных приборах nunit.Как управлять сеансами в модульных тестах NHibernate?

В следующем испытательном оборудовании я тестирую репозиторий. Мой конструктор репозитория принимает ISession (поскольку я буду использовать сеанс для запроса в своем веб-приложении).

В настройках моего тестового адаптера я настраиваю NHibernate и строю фабрику сеансов. В моей тестовой настройке я создаю чистую базу данных SQLite для каждого выполненного теста.

[TestFixture] 
public class SimpleRepository_Fixture 
{ 
    private static ISessionFactory _sessionFactory; 
    private static Configuration _configuration; 

    [TestFixtureSetUp] // called before any tests in fixture are executed 
    public void TestFixtureSetUp() { 
     _configuration = new Configuration(); 
     _configuration.Configure(); 
     _configuration.AddAssembly(typeof(SimpleObject).Assembly); 
     _sessionFactory = _configuration.BuildSessionFactory(); 
    } 

    [SetUp] // called before each test method is called 
    public void SetupContext() { 
     new SchemaExport(_configuration).Execute(true, true, false); 
    } 

    [Test] 
    public void Can_add_new_simpleobject() 
    { 
     var simpleObject = new SimpleObject() { Name = "Object 1" }; 

     using (var session = _sessionFactory.OpenSession()) 
     { 
      var repo = new SimpleObjectRepository(session); 
      repo.Save(simpleObject); 
     } 

     using (var session =_sessionFactory.OpenSession()) 
     { 
      var repo = new SimpleObjectRepository(session); 
      var fromDb = repo.GetById(simpleObject.Id); 

      Assert.IsNotNull(fromDb); 
      Assert.AreNotSame(simpleObject, fromDb); 
      Assert.AreEqual(simpleObject.Name, fromDb.Name); 
     } 
    } 
} 

Является ли это хорошим подходом или я должен обрабатывать сеансы по-разному?

+0

Технически, это могло бы быть лучше, чтобы начать с абсолютно чистыми на каждом модульном тесте (новая конфигурация перед каждым испытанием), но это займет слишком много времени, чтобы выполнить много тестов по этому пути, так Я использую нечто похожее на вашу версию. – Paco

ответ

1

Это выглядит довольно хорошо, но я бы создал как базовый класс. Посмотрите, как это делает Айенде.

http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspx

+0

В этом базовом классе Айенде создает db один раз для всех тестов. Я читал, что лучше сделать это один раз за тест. Возможно ли это благодаря базовому классу? –

+0

Я только что реализовал этот базовый класс, и на самом деле это очень хорошо. Определенно рекомендуется. –

Смежные вопросы