Asp.net mvc 3 TDD将模拟存储库(UnitOfWork)注入到内部构造函数中

Asp.net mvc 3 TDD将模拟存储库(UnitOfWork)注入到内部构造函数中,asp.net-mvc-3,tdd,repository,Asp.net Mvc 3,Tdd,Repository,我正在研究TDD,我遇到了一个需要帮助的场景 我的项目使用MVC3,结构上有一个BAL和一个DAL层。每个层都在其自己的项目中。BAL通过存储库模式访问数据库。因为我使用的是EntityFramework,所以我还实现了UnitOfWork模式。以下是BAL中的服务类的外观: public class ExampleService { private UnitOfWork unitOfWork; private bool isProcessing = false; in

我正在研究TDD,我遇到了一个需要帮助的场景

我的项目使用MVC3,结构上有一个BAL和一个DAL层。每个层都在其自己的项目中。BAL通过存储库模式访问数据库。因为我使用的是EntityFramework,所以我还实现了UnitOfWork模式。以下是BAL中的服务类的外观:

public class ExampleService
{
    private UnitOfWork unitOfWork;
    private bool isProcessing = false;

    internal ExampleService(UnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
    }
    public void ExposedMethod()
    {
        //do stuff with the unitOfWork
    }
}
问题:我想为此创建一个单元测试(显然我应该在编写代码之前编写测试)。但是,如果我按原样运行代码,测试将是一个集成测试,因为它将使用UnitOfWork并连接到我的数据库。我可以模拟一个新的UnitOfWork来访问内存中的虚拟数据,但我不知道如何注入它,因为构造函数是内部的。我不希望编写驻留在每个项目中的单元测试


有什么想法吗?

您可以使用属性装饰包含此类的程序集,以便使所有内部成员在单元测试项目中可见


另一种可能是将此构造函数公开,因为这将使类更具可重用性。通常,DI连线应该在体系结构(GUI)的最外层完成,因此不同依赖项的构造函数需要是公共的。这允许在其他项目中重用此DAL层。

您可以使用属性装饰包含此类的程序集,以便使所有内部成员在单元测试项目中可见


另一种可能是将此构造函数公开,因为这将使类更具可重用性。通常,DI连线应该在体系结构(GUI)的最外层完成,因此不同依赖项的构造函数需要是公共的。这允许在其他项目中重用此DAL层。

[InternalsVisibleTo]将按原样解决我的问题。我可能仍然缺少DI的一些东西,但是我展示的示例类在BAL中,UnitOfWork在DAL中。我将构造函数标记为internal,因为我有另一个类控制对示例类的访问。我得再考虑一下。谢谢[InternalsVisibleTo]将按原样解决我的问题。我可能仍然缺少DI的一些东西,但是我展示的示例类在BAL中,UnitOfWork在DAL中。我将构造函数标记为internal,因为我有另一个类控制对示例类的访问。我得再考虑一下。谢谢