Frage

meine Controller in meiner ASP.NET MVC-Anwendung sind auf der IDataContext abhängig, die einen Wrapper um die NHibnerate Sitzung ist so, dass ich einfach dieses später ersetzen kann. Ich verwende die Microsoft Unity IOC-Container meine Abhängigkeiten innerhalb der Konstrukteurs meiner Klassen zu injizieren.

Ich habe versucht, zuerst ein FakeDataContext In meinem Testprojekt und das Setup die richtigen Abhängigkeiten wie folgt erstellt:

public class BaseControllerTest {
    [TestInitialize]
    public void Init() {
        // Create the ioc container
        var container = new UnityContainer();

        // Setup the common service locator (must come before any instance registered that use the common service locator such as membership provider)
        ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container));

        // Configure the container
        container.RegisterType<IDataContext, FakeDataContext>();
    }
}

Jetzt alles, was ich tun müssen, um von dieser Klasse erben wird und alles funktioniert gut, aber ich finde, dass der FakeDataContext ist nicht die genaue Art und Weise meiner Tests durchzuführen, so versuche ich, ein im Speicher Sitzung erstellen SQLite. Ich habe die modifizierte oben an:

public class BaseControllerTest {
    private static Configuration _configuration;

    [TestInitialize]
    public void Init() {
        // Create the ioc container
        var container = new UnityContainer();

        // Configure the container
        container.RegisterType<ISessionFactory>(new ContainerControlledLifetimeManager(), new InjectionFactory(c => {
            return CreateSessionFactory();
        }));
        container.RegisterType<ISession>(new InjectionFactory(c => {
            var sessionFactory = container.Resolve<ISessionFactory>();
            var session = sessionFactory.OpenSession();
            BuildSchema(session);
            return session;
        }));
        container.RegisterType<IDataContext, NHibernateDataContext>();
    }

    private static ISessionFactory CreateSessionFactory() {
        return Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.InMemory())
            .Mappings(m => m.FluentMappings
                .AddFromAssembly(Assembly.GetExecutingAssembly())
                .Conventions.AddFromAssemblyOf<EnumConvention>())
            .ExposeConfiguration(c => _configuration = c)
            .BuildSessionFactory();
    }

    private static void BuildSchema(ISession session) {
        var export = new SchemaExport(_configuration);
        export.Execute(true, true, false, session.Connection, null);
    }
}

Allerdings wirft dies der Fehler „ein ungültige oder nicht komplette Konfiguration verwendet wurde, während eine Session zu schaffen.“. Ich dachte, das könnte, weil die Entitäten die Zuordnungen für suchen in einem anderen Projekt aus dem Testprojekt sind so i Assembly.LoadFile ( „C: .. \ MyAssembly.dll“) versucht zu sagen. Aber immer noch nicht funktioniert

Bitte beachten Sie, dass ich den folgenden Artikel verwendet http://www.mohundro.com/blog/CommentView,guid,fa72ff57-5c08-49fa-979e-c732df2bf5f8.aspx zu helfen, aber es ist nicht genau das, was ich suche.

Ich würde es begrüßen, wenn jemand helfen könnte. Dank

War es hilfreich?

Lösung

Problem gelöst. Ich brauchte einen Verweis auf den SQLite-DLL hinzuzufügen. Ich habe auch die Sitzung der ContainerControlledLifetimeManager aswell als Sitzungs Fabrik zu verwenden. Bitte korrigieren Sie mich, wenn es eine effizientere Art und Weise, dies zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top