单元测试数据访问层时遇到问题。我通过存储过程查询数据库,所以现在我不能使用Entity Framework内存数据库,因为内存数据库不是关系数据库。另外,我读到我必须使用集成测试,但我找不到任何使用存储过程进行测试的示例。
所以我的问题是如何测试数据访问层,我是否需要创建一个与我的真实数据库相同的测试数据库?
这是我的数据访问层代码:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : Domains.Users
{
private DbSet<TEntity> dbSet;
private readonly DbContext context;
public Repository(DbContext context)
{
this.context = context;
dbSet = context.Set<TEntity>();
}
public void Add(TEntity entity)
{
if (entity is Domains.Users)
{
SqlParameter param1 = new SqlParameter();
param1.ParameterName = "@Adress";
param1.DbType = System.Data.DbType.String;
param1.Value = (entity as Domains.Users).Adress;
SqlParameter param2 = new SqlParameter();
param2.ParameterName = "@Email";
param2.DbType = System.Data.DbType.String;
param2.Value = (entity as Domains.Users).Email;
SqlParameter param3 = new SqlParameter();
param3.ParameterName = "@Name";
param3.DbType = System.Data.DbType.String;
param3.Value = (entity as Domains.Users).Name;
SqlParameter param4 = new SqlParameter();
param4.ParameterName = "@Lastname";
param4.DbType = System.Data.DbType.String;
param4.Value = (entity as Domains.Users).Lastname;
context.Database.ExecuteSqlCommand("sp_AddUser @Adress, @Email, @Name, @Surname", param1, param2, param3, param4);
}
}
}
答案 0 :(得分:3)
我的建议是使用测试(真实)数据库(根据您公司的政策,它可以测试服务器上的数据库,或者您可以使用您的开发计算机上的数据库提供程序的本地实例等。)
集成测试的目的是验证您的应用程序是否作为单个单元运行稳定。测试环境必须尽可能接近生产evn。这意味着真实数据库。内存数据库表示中的EF对此没有好处。
您还可以查看 component tests 。它们就像集成测试一样,但是使用它们你不会将应用程序作为一个单元进行测试,而是应用程序的主要组件,如存储库,服务......等,另一方面进行集成测试,你最喜欢测试REST api端点(在REST应用程序的上下文中)。
关于集成/组件测试的一些注意事项
集成测试示例
如果您正在开发REST api(仅举例)。这是非常基本的测试用例,不能作为100%最佳实践。只是想看看它们可能是什么。
注意:在某些情况下,在我们开始开发实际数据库之前,我们仅在应用程序的请求中使用内存表示进行一些原型设计。