c# - 如何使用 ADO.NET Entity Framework 测试存储库模式?

标签 c# asp.net-mvc design-patterns tdd repository-pattern

在使用存储库模式时,我发现很难理解使用 TDD 技术设计软件的原因,而实际上您必须在持久性数据集中为存储库实现接口(interface)。

为了阐明我的观点,我将提交一个示例:

我的域模型上有以下接口(interface):

public interface IUserRepository
{
    IQueryable<User> FindAllUsers();
    void AddUser(User newUser);
    User GetUserByID(int userID);
    void Update(User userToUpdate);
}

出于测试目的,我有以下接口(interface)实现:

public class FakeUserRepository : IUserRepository
{
    private IList<User> _repository;

    public FakeUserRepository()
    {
        _repository = new List<User>();
        ... //create all users for testing purposes

    }

    public IQueryable<User> FindAllUsers()
    {
        return _repository.AsQueryable<User>(); //returns all users
    }

现在我创建一些测试:

  1. 可以_添加_用户
  2. 可以为用户添加帐户
  3. Can_Add_ShareSpace 用于一个用户与另一个用户的帐户。

我的问题是,在我用我的 FakeUserRepository 实现测试所有这些之后,我必须返回并在我的实际持久性数据集(例如 SQL)上实现 IUserRepository,并且我必须再次实现代码,所以我的单元测试是实际上并没有检查我在我的应用程序上实际使用的代码。

也许我遗漏了什么。

一如既往的感谢!

下面是我的持久数据访问存储库,它应该被测试(至少在我看来是这样),但我不应该测试连接到数据库:

public class SQLUserRepository : IUserRepository
{
    private BusinessDomainModel.EntityModel.BusinessHelperAccountDBEntities _repository;

    public SQLUserRepository()
    {
        _repository = new BusinessHelperAccountDBEntities();
    }

    #region IUserRepository Members

    public IQueryable<User> FindAllUsers()
    {
        return _repository.UserSet.AsQueryable();
    }

最佳答案

永远不要测试模拟。被测试的类应该始终是该类的真实实例,尽管您可以并且应该模拟它的任何依赖项,以便您可以单独测试它。

关于c# - 如何使用 ADO.NET Entity Framework 测试存储库模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1501375/

相关文章:

c# - 如何定期执行非阻塞 C# 方法?

javascript - "Uncaught SyntaxError: Unexpected token import"在 ASP 5/MVC6 中使用 moment js

php - 在 CRUD 中将创建和更新作为一项操作

sql - 我如何更改 php 中的模式?

c# - 在 C# 中使用 RSACryptoServiceProvider 查找公钥和私钥

c# - 如何使用元数据类验证数据注释

c# - 如何让 Visual Studio 2017 编辑器支持不同的编码风格?

c# - 升级到 .net 5 程序集缺少框架版本

asp.net-mvc - 通用成员(member)提供商造成用户性能问题

design-patterns - Windows 服务的六边形架构/端口和适配器架构。正确的路?