Как мне настроить список тестовых организаций с моим новым DBContext? - PullRequest
0 голосов
/ 09 марта 2019

У меня есть приложение с несколькими контекстами для EF, сначала код, сначала сервер, и все динамические.У меня есть класс, который я вызываю, чтобы получить эти контексты в моем приложении.Каждый контекст реализует интерфейс, такой как:

public interface IDatabaseContextSwitcher
{
    IVGSContext GetDatabase(string organization);
    IVGSContext GetDatabase(Guid organizationGuid, string email);
    IVGSServerConn GetServerDatabase(string databaseName);
    IAuthContext GetAuthorizationDatabase();
}

. Поэтому у меня есть класс, который реализует экземпляры этих интерфейсов в приложении.(VGSContext, VGSServerConn и AuthContext).

Я пытаюсь проверить их в своем тестовом проекте.Я сделал новые классы из интерфейсов, планируя подключить некоторые DbSets к этим новым классам, а затем проверить, что мои контроллеры работают правильно.

Однако я не могу понять, как инициализироватьDBSets.

Например, при Add добавляется следующее:

 public AuthContextForTesting()
    {


        Organizations.Add(new Organization()
            {OrganizationName = "Test1", PK_Organization = Guid.Parse("34CE4F83-B3C9-421B-B1F3-42BBCDA9A004")});
        var cnt = Organizations.Count();
    }
    public DbSet<Organization> Organizations { get; set; }

Я попытался инициализировать DBSet с помощью: Organizations = new DbSet ();Но выдает ошибку, что это не разрешено из-за разрешений.

Как настроить исходные наборы dbsets в коде для моих тестов?

1 Ответ

0 голосов
/ 12 марта 2019

Чтобы иметь возможность сделать это, сначала вы должны получить класс из DBSet. К сожалению, мое приложение использует Core EF и EF 6, поэтому мне пришлось создать 2 класса.

EF 6 Класс

public class FakeDbSet<T> : System.Data.Entity.DbSet<T>, IDbSet<T> where T : class
{
    List<T> _data;

    public FakeDbSet()
    {
        _data = new List<T>();
    }

    public override T Find(params object[] keyValues)
    {
        throw new NotImplementedException("Derive from FakeDbSet<T> and override Find");
    }

    public override T Add(T item)
    {
        _data.Add(item);
        return item;
    }

    public override T Remove(T item)
    {
        _data.Remove(item);
        return item;
    }

    public override T Attach(T item)
    {
        return null;
    }

    public T Detach(T item)
    {
        _data.Remove(item);
        return item;
    }

    public override T Create()
    {
        return Activator.CreateInstance<T>();
    }

    public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T
    {
        return Activator.CreateInstance<TDerivedEntity>();
    }


    public List<T> Local
    {
        get { return _data; }
    }

    public override IEnumerable<T> AddRange(IEnumerable<T> entities)
    {
        _data.AddRange(entities);
        return _data;
    }

    public override IEnumerable<T> RemoveRange(IEnumerable<T> entities)
    {
        for (int i = entities.Count() - 1; i >= 0; i--)
        {
            T entity = entities.ElementAt(i);
            if (_data.Contains(entity))
            {
                Remove(entity);
            }
        }

        return this;
    }

    Type IQueryable.ElementType
    {
        get { return _data.AsQueryable().ElementType; }
    }

    System.Linq.Expressions.Expression IQueryable.Expression
    {
        get { return _data.AsQueryable().Expression; }
    }

    IQueryProvider IQueryable.Provider
    {
        get { return _data.AsQueryable().Provider; }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _data.GetEnumerator();
    }

    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        return _data.GetEnumerator();
    }
}

EF Core должен был включать некоторые интерфейсы для работы.

public class FakeCoreDbSet<T> : Microsoft.EntityFrameworkCore.DbSet<T> , IQueryable, IEnumerable<T> where T : class
{
    List<T> _data;

    public FakeCoreDbSet()
    {
        _data = new List<T>();
    }

    public override T Find(params object[] keyValues)
    {
        throw new NotImplementedException("Derive from FakeDbSet<T> and override Find");
    }

    public override EntityEntry<T> Add(T item)
    {
        _data.Add(item);
        //return item;
        return null;
    }

    public override EntityEntry<T> Remove(T item)
    {
        _data.Remove(item);
        //return item;
        return null;
    }

    public override EntityEntry<T> Attach(T item)
    {
        return null;
    }

    public T Detach(T item)
    {
        _data.Remove(item);
        return item;
    }

    public IList GetList()
    {
        return _data.ToList();
    }
    //public override T Create()
    //{
    //    return Activator.CreateInstance<T>();
    //}

    public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T
    {
        return Activator.CreateInstance<TDerivedEntity>();
    }
    public List<T> Local
    {
        get { return _data; }
    }


    public override void AddRange(IEnumerable<T> entities)
    {
        _data.AddRange(entities);
        //return _data;
    }

    public override void RemoveRange(IEnumerable<T> entities)
    {
        for (int i = entities.Count() - 1; i >= 0; i--)
        {
            T entity = entities.ElementAt(i);
            if (_data.Contains(entity))
            {
                Remove(entity);
            }
        }

        // this;
    }

    Type IQueryable.ElementType
    {
        get { return _data.AsQueryable().ElementType; }
    }

    System.Linq.Expressions.Expression IQueryable.Expression
    {
        get { return _data.AsQueryable().Expression; }
    }

    IQueryProvider IQueryable.Provider
    {
        get { return _data.AsQueryable().Provider; }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _data.GetEnumerator();
    }

    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        return _data.GetEnumerator();
    }

}

Как только они были созданы, я мог использовать MockObjects, чтобы добраться до них. Примечание _dbContextSwitcher - это класс, созданный с помощью Moq, который вызывает различные базы данных.

var vgsdatabase = new Mock<IVGSContext>();
        var settings=new FakeCoreDbSet<Setting>();
        settings.Add(new Setting()
        {
            SettingID = "OrgPrivacy",
            PK_Setting = Guid.NewGuid(),
            UserID = "",
            Value = "No"

        });
        vgsdatabase.Setup(s => s.Setting).Returns(settings);
        _dbcontextSwitcher.Setup(s => s.GetDatabase(It.IsAny<string>())).Returns(vgsdatabase.Object);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...