【发布时间】:2019-01-11 20:17:05
【问题描述】:
如何对连接到数据库的服务进行单元测试?
我在数据访问层有一个playerRepository 类,它直接与数据库交互,在业务层有一个playerService 类,它创建一个playerRepository 的实例并为随机的东西提供服务,例如 - 删除播放器,保存播放器,获取所有玩家,通过 id/name 获取玩家 yadda yadda。
我想在不使用真实数据库的情况下对playerService 进行单元测试,而是使用 EF 提供的内存数据库。
问题是,我不知道如何设置它。
我有一个 PlayerContext : DbContext 类,用作代码优先的模型(通过 EF 教程完成这部分)。而且我必须在构造函数DbContextOptionsBuilder<PlayerContext> 中添加一个参数,但我不知道从哪里开始。我不知道如何以及在哪里设置连接字符串,“默认”数据库本身存储在哪里。
我想通过使用没有 NSubstitute 或 Moq 的 EF 来做到这一点,我这样做是为了了解它是如何在不使用除 EF 之外的其他框架的情况下完成的。
public class PlayerContext : DbContext
{
public PlayerContext() : base()
{
}
public DbSet<Player> Players { get; set; }
}
public class Player
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int DciNumber { get; set; }
}
我正在使用 Visual Studio 提供的单元测试
[TestClass]
public class PlayerServiceTest
{
// Should get all the players from database
[TestMethod]
public void GetAllPlayers()
{
// arrange - act
// TODO: Return all the players from the database
// assert
// TODO: Should return empty list
}
PlayerService 类看起来像这样
public class PlayerService
{
private PlayerRepository _playerRepository = new PlayerRepository();
public List<Player> GetAllPlayers()
{
var players = _playerRepository.GetAllPlayers();
return players;
}
播放器存储库
public class PlayerRepository
{
public List<Player> GetAllPlayers()
{
using (var context = new PlayerContext())
{
var players = context.Players.ToList();
return players;
}
}
一般我的问题是:
如何使
PlayerContext与另一个连接字符串在单元测试的情况下连接到内存数据库,以及如何在不通过单元测试运行时为其提供正确的连接字符串如何更改数据库的位置,因为它使用
C:\Users中的默认路径。
我不是在寻找与 DAL 的 PlayerRepository 的集成测试,我只是想测试业务层,我所需要的只是,当我运行 PlayerService 使用连接到内存的 PlayerRepository 的测试时数据库,就是这样。否则它应该连接到存储在与应用程序的主 exe 相同的文件夹中的本地数据库
需要帮助!
【问题讨论】:
-
我建议您检查github.com/v-zubritsky/Reseed,一旦确定内存不足以进行您的测试。内存数据库显然具有与真实数据库不同的行为,因此通常不能将其用作替代品,即使用它会牺牲测试质量。这并不意味着您不需要通过使用依赖注入等方法将逻辑与数据访问层解耦来改进设计。
标签: c# database winforms entity-framework unit-testing