3 Stimmen

Wie man Sitzungen in NHibernate-Unit-Tests verwaltet?

Ich bin mir ein wenig unsicher, wie ich Sitzungen innerhalb meiner Nunit-Testvorrichtung verwalten soll.

In der folgenden Testvorrichtung teste ich ein Repository. Mein Repository-Konstruktor nimmt eine ISession entgegen (da ich pro Anfrage eine Sitzung in meiner Webanwendung verwenden werde).

In meinem Testvorrichtungs-Setup konfiguriere ich NHibernate und erstelle die Sitzungsfabrik. In meinem Test-Setup erstelle ich für jeden ausgeführten Test eine saubere SQLite-Datenbank.

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

    [TestFixtureSetUp] // wird aufgerufen, bevor Tests in der Vorrichtung ausgeführt werden
    public void TestFixtureSetUp() {
        _configuration = new Configuration();
        _configuration.Configure();
        _configuration.AddAssembly(typeof(SimpleObject).Assembly); 
        _sessionFactory = _configuration.BuildSessionFactory();
    }

    [SetUp] // wird aufgerufen, bevor jede Testmethode aufgerufen wird
    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);
        }
    }
}

Ist dies ein guter Ansatz oder sollte ich die Sitzungen anders behandeln?

0 Stimmen

Technisch gesehen wäre es möglicherweise besser, mit einem völlig sauberen Zustand bei jedem Unit-Test zu starten (neue Konfiguration vor jedem Test), aber es würde zu lange dauern, viele Tests auf diese Weise auszuführen, also verwende ich etwas sehr Ähnliches wie deine Version.

1voto

Corey Coogan Punkte 1529

Dies sieht ziemlich gut aus, aber ich würde es als Basisklasse erstellen. Schau dir an, wie Ayende es macht.

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

0 Stimmen

In dieser Basisklasse erstellt Ayende die db einmal für alle Tests. Ich habe gelesen, dass es besser ist, dies einmal pro Test zu tun. Ist dies immer noch möglich über die Basisklasse?

0 Stimmen

Ich habe gerade diese Basisklasse implementiert und sie ist tatsächlich sehr gut. Auf jeden Fall empfehlenswert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X