Question

mes contrôleurs dans mon application ASP.NET MVC dépendent de la IDataContext qui est une enveloppe autour de la session NHibnerate afin que je puisse facilement remplacer plus tard. J'utilise le conteneur du CIO unité Microsoft pour injecter mes dépendances au sein des constructeurs de mes classes.

J'ai d'abord essayé créé un FakeDataContext dans mon projet de test et de configuration des dépendances correctes comme suit:

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>();
    }
}

Maintenant, tout ce que je dois faire est d'hériter de cette classe et tout fonctionne bien, mais je pense que le FakeDataContext n'est pas la façon la plus précise pour réaliser mes tests, donc je suis en train de créer une séance de mémoire en utilisant SQLite. J'ai modifié ci-dessus à:

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);
    }
}

Cependant, cela jette l'erreur « invalide ou incomplète configuration a été utilisée lors de la création d'une SessionFactory. ». Je pensais que cela pourrait être parce que les entités les mappings recherchent sont dans un projet différent du projet d'essai donc j'ai essayé de dire Assembly.LoadFile ( « C: .. \ MyAssembly.dll »). Mais cela ne fonctionne toujours pas

S'il vous plaît noter que j'utilisé l'article suivant http://www.mohundro.com/blog/CommentView,guid,fa72ff57-5c08-49fa-979e-c732df2bf5f8.aspx à l'aide, mais ce n'est pas exactement ce que je cherche.

Je vous en serais reconnaissant si quelqu'un pouvait aider. Merci

Était-ce utile?

La solution

Problème résolu. Je avais besoin d'ajouter une référence à la dll SQLite. J'ai aussi changé la session d'utiliser le aswell ContainerControlledLifetimeManager comme l'usine de session. S'il vous plaît me corriger s'il y a un moyen plus efficace de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top