Это базовый 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 нужно проверить счетчик, если он добавлен / удален, и поля свойств, если он обновлен.