c# - TDD - 想用一个假的存储库测试我的服务层,但是如何?

标签 c# asp.net asp.net-mvc repository-pattern

我设计了一个使用存储库模式的应用程序,然后是一个单独的服务层,如下所示:

公共(public)类注册服务:IRegistrationService
{
    公共(public)无效注册(用户用户)
    {
        IRepository<用户> userRepository = new UserRepository();
       //添加用户等
    }
}

如您所见,我在 Register 方法中实例化了我的存储库。现在我想编写一些单元测试,但我无法真正做到并用一个虚假的存储库替换它,可以吗?

虽然我不想将存储库添加为类变量(并通过构造函数设置它),因为我认为这会使我的代码“臭”(并非所有方法都需要所有存储库,而且我不需要调用层了解存储库等)。

建议?

最佳答案

你需要使用依赖注入(inject)。 UserRepository 是您的 RegistrationService 类的依赖项。为了使您的类正确地进行单元测试(即隔离它们的依赖项),您需要“反转”控制依赖项创建的内容。目前,您拥有直接控制权,并在内部创建它们。只需反转该控制,并允许外部的东西(例如像 CaSTLe Windsor 这样的 IoC 容器)注入(inject)它们:

public class RegistrationService: IRegistrationService
{
    public RegistrationService(IRepository<User> userRepo)
    {
        m_userRepo = userRepo;
    }

    private IRepository<User> m_userRepo;

    public void Register(User user)
    {
        // add user, etc with m_userRepo
    }
}

我想我忘了补充。一旦允许注入(inject)依赖项,就打开了它们可模拟的可能性。由于您的 RegistrationService 现在将其依赖的用户存储库作为其构造函数的输入,您可以创建一个模拟存储库并将其传入,而不是实际的存储库。

关于c# - TDD - 想用一个假的存储库测试我的服务层,但是如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/935894/

相关文章:

jquery - 模型验证摘要未显示

c# - Protobuf-net:是否可以生成未映射到具体类型的 RuntimeTypeModel?

c# - 从包含 '\0' 个字符的非托管 C++ DLL 返回 LPTSTR

asp.net - 应用程序池的启动模式和空闲超时操作之间是否存在冲突?

asp.net - 在 ASP.NET Core 中生成报告的最佳方法是什么?

c# - 如何使用 ASP.NET MVC 在单击按钮时导出 Excel 工作表中的数据

c# - 从 Postgresql 数据库 ServiceStack.Ormlite 生成类对象

c# - 如何在此代码中放置防护属性?

c# - 如何使用CSS在电子邮件正文中发送网页

c# - 打开使用 EPPlus 创建并使用 ICSharpCode.SharpZipLib 压缩到文件夹中的 .xlsx 文件时出现问题