Как проверить репозиторий с помощью базы данных InMemory? - PullRequest
0 голосов
/ 05 марта 2020

Это базовый DbRepository, который является обобщенным c, и мне нужно проверить.

    public class DbRepository<TEntity, TDbContext> : IRepository<TEntity>
    where TEntity : class, IEntity
    where TDbContext : DbContext
    {
    private static readonly string noEntity = "No such entity found!";
    private static readonly string noId = "No such entity with that Id found!";
    protected readonly TDbContext dbContext;

    public DbRepository(TDbContext dbContext)
    {
        this.dbContext = dbContext;
    }

    public async Task<TEntity> AddAsync(TEntity entity)
    {
        EntityCheck(entity);

        await dbContext.Set<TEntity>().AddAsync(entity);
        await dbContext.SaveChangesAsync();

        return entity;
    }

    public async Task<TEntity> GetAsync(object primaryKey)
    {
        PrimaryKeyCheck(primaryKey);

        return await dbContext.Set<TEntity>().FindAsync(primaryKey);
    }

    private void PrimaryKeyCheck(object primaryKey)
    {
        if (primaryKey == null) throw new NotFoundException(noId);
    }

    private void EntityCheck(TEntity entity)
    {
        if (entity == null)
        {
            throw new NotFoundException(noEntity);
        }
    }

Это BasicTestSetup, где у меня есть:

    public class BaseRepositorySetup
    {
    protected DbContextOptions<ApplicationDbContext> dbContextOptions;
    protected ServiceProvider serviceProvider;
    protected ApplicationDbContext applicationDbContext;



    public void TestSetup(string databaseName = null)
    {
        if (databaseName == null)
        {
            databaseName = GetTestName();
        }
        AccessList.Build();

        TestCleanup();
        serviceProvider = new ServiceCollection()
            .AddEntityFrameworkInMemoryDatabase()
            .BuildServiceProvider();

        dbContextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseInMemoryDatabase(databaseName)
            .UseInternalServiceProvider(serviceProvider)
            .Options;
    }

    private string GetTestName()
    {
        var stack = new StackTrace();
        for (int i = 2; i < stack.FrameCount; i++)
        {
            var frame = stack.GetFrame(i);
            if (frame.GetMethod().GetCustomAttribute<TestAttribute>() == null)
            {
                continue;
            }

            return frame.GetMethod().Name;
        }

        return null;
    }

    [TearDown]
    protected void TestCleanup()
    {
        applicationDbContext?.Dispose();
        serviceProvider?.Dispose();

        applicationDbContext = null;
        serviceProvider = null;
    }

public class TestClass
{
    public string Id { get; set; }
}

Вопрос в том, как мне проверить это сейчас? Мне нужно использовать базу данных в памяти из структуры сущностей.

 [TestFixture]
    public class BaseRepositoryTest : BaseRepositorySetup
    {
        [Test]
        public void Add_Should_Create()
        {
            TestSetup();
            var testclass = new TestClass();
            var repo = new DbRepository<TestClass, ApplicationDbContext>(applicationDbContext);
            var result = await repo.AddAsync(testclass);
            var x = await applicationDbContext.Set<TestClass>().CountAsync();
            Assert.AreEqual(x, 1);
        }
    }

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Как мне установить DbSet здесь? Что именно мне нужно проверить в тесте?

В моем понимании основ c нужно проверить счетчик, если он добавлен / удален, и поля свойств, если он обновлен.

...