Pregunta

mis controladores en mi aplicación ASP.NET MVC dependen de la IDataContext que es una envoltura alrededor de la sesión NHibnerate de modo que pueda sustituir fácilmente esta tarde. Yo uso el contenedor de Microsoft Unidad COI para inyectar mis dependencias dentro de los constructores de mis clases.

intentó por primera vez creado un FakeDataContext dentro de mi proyecto de prueba y la configuración de las dependencias correctas de la siguiente manera:

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

Ahora todo lo que tengo que hacer es heredar de esta clase y todo funciona bien, pero siento que el FakeDataContext no es la forma más precisa para llevar a cabo mis pruebas, así que estoy tratando de crear una sesión en memoria utilizando SQLite. He modificado el anterior a:

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

Sin embargo esto arroja el error "un inválido o se utilizó configuración incompleta mientras que la creación de una SessionFactory.". Pensé que esto podría ser debido a que las Entidades de las asignaciones se buscan están en un proyecto diferente del proyecto de prueba así que intenté decir Assembly.LoadFile ( "C: .. \ MyAssembly.dll"). Pero esto aún no funcionaba

Tenga en cuenta que he utilizado el siguiente artículo http://www.mohundro.com/blog/CommentView,guid,fa72ff57-5c08-49fa-979e-c732df2bf5f8.aspx de ayuda, pero no es exactamente lo que estoy buscando.

te agradecería si alguien podría ayudar. Gracias

¿Fue útil?

Solución

Problema resuelto. Yo tenía que añadir una referencia a la DLL SQLite. También ha cambiado la sesión para usar la también de ContainerControlledLifetimeManager como la fábrica de sesión. Por favor, corríjanme si hay una manera más eficiente de hacer esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top