Модульное тестирование динамических запросов в Entity Framework 4 - PullRequest
1 голос
/ 01 декабря 2010

При реализации шаблона Unit of Work с помощью Entity Framework 4.0, каков правильный дизайн, позволяющий создавать динамические запросы с помощью метода CreateQuery контекста объекта?И под правильным я подразумеваю проектирование как-то, что я могу использовать его в модульном тесте с фиктивными объектами.

Спасибо.

1 Ответ

0 голосов
/ 18 августа 2011

Не знаю, что вы подразумеваете под «правильным», это зависит от вашей ситуации, но общий ответ таков: вам понадобятся некоторые абстракции, которые можно заменить во время теста. Для вдохновения вот что мы используем (мы используем самоконтроль poco entity)

/// <summary>
/// Object context interface for abstracting the service layer from the
/// implementation details of object storage.
/// </summary>
public interface IObjectContext : IDisposable
{
    /// <summary>
    /// Returns the entity objects of the given type known by this object context.
    /// </summary>
    /// <typeparam name="TEntity">The type of the entity.</typeparam>
    /// <returns>The instances of the given type already loaded into this object context</returns>
    IEnumerable<TEntity> GetManagedEntities<TEntity>() where TEntity : EntityBase;

    /// <summary>
    /// Creates an object set for the provided entity type.
    /// </summary>
    /// <typeparam name="TEntity">The type of the entity.</typeparam>
    /// <returns></returns>
    IObjectSet<TEntity> CreateObjectSet<TEntity>() where TEntity : EntityBase;

    /// <summary>
    /// Applies the changes made to the provided entity object graph to this object context.
    /// </summary>
    /// <typeparam name="TEntity">The type of entity (inferred).</typeparam>
    /// <param name="entity">The entity object graph that has been modified.</param>
    void ApplyChanges<TEntity>(TEntity entity) where TEntity : EntityBase, IObjectWithChangeTracker;

    /// <summary>
    /// Saves the changes known by this object context instance to the database.
    /// </summary>
    void Save();

    /// <summary>
    /// Creates a new logical unit of work spanning a single business transaction.
    /// </summary>
    IUnitOfWork CreateUnitOfWork();

    /// <summary>
    /// Creates a new logical unit of work spanning a single business transaction.
    /// </summary>
    /// <param name="isolationLevel">The transaction isolation level used by the
    /// unit of work ambient transaction.</param>
    /// <returns></returns>
    IUnitOfWork CreateUnitOfWork(IsolationLevel isolationLevel);
}

и для абстрагирования транзакций

/// <summary>
/// Interface abstraction for a unit of work, aka all persistent work spanning a single
/// business transaction and to be performed in unity.
/// </summary>
/// <remarks>Used to support outer and inner units of work where one outer UoW may consist
/// of multiple nested inner UoW instances and have all of them share a transaction.</remarks>
public interface IUnitOfWork : IDisposable
{
    /// <summary>
    /// Gets the transaction isolation level used by the unit of work ambient transaction.
    /// </summary>
    /// <value>The isolation level.</value>
    IsolationLevel IsolationLevel { get; }

    /// <summary>
    /// Gets the transaction timeout time span used by the unit of work ambient transaction.
    /// </summary>
    /// <value>The transaction timeout duration.</value>
    TimeSpan TransactionTimeout { get; }

    /// <summary>
    /// Completes the unit of work that this instance represents.
    /// </summary>
    /// <remarks>
    /// For an outer unit of work, will persist all changes represented by this business
    /// transaction and will then signal the ambient transaction in use as complete.
    /// For an inner unit of work, will signal itself as completed to the outer unit of
    /// work that it is part of.
    /// </remarks>
    void Complete();
}

затем измените код генерации контекста объекта для поддержки этих интерфейсов + внедрите свой UoW в соответствии с вашими потребностями (наша реализация опущена для краткости). НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...