0

我正在开发一个使用 Linq2SQL 进行数据访问的项目。该项目由一个 ASP.NET MVC 应用程序和 8 个类库组成。大多数类库都有自己的 L2S 数据类。

作为我正在做的工作的一部分,我试图让各种被测组件引入一些稳定性清理代码库,它目前大量使用静态类和方法,并且控制器具有使用的静态 DataContexts自始至终。

如何重构 L2S 使用,以便我可以测试控制器操作?

我已经在应用程序中引入了依赖注入来解耦其他一些服务,但我不希望 DataContext 作为控制器的依赖属性,因为我想控制 DataContext 及其 DataLoadOptions 的实例化。

我确实尝试过的一件事是利用 L2S 生成的部分类并向 DataContexts 添加一个接口,但我发现抽象冒泡它进入了应用程序,而不是停留在类库中。感觉这不是正确的做事方式,维护起来会很痛苦。有没有人用这种方法取得过任何特别的成功或失败?

4

2 回答 2

3

我使用存储库模式隐藏DataContext在里面。存储库是抽象的,因此非常适合依赖注入原则。

例如,您定义了一些存储库。

public interface IUserRepository
{
    User Get(int id);
    User Save(User user);
    void Delete(User user);
}

实现类似于

public class UserRepository : IUserRepository
{
    private MyDataContext _context;

    UserRepository() 
    {
        _context = new MyDataContext();
    }

   // ...

}

现在,控制器只依赖于接口。

public UserController : Controller
{
    UserController(IUserRepository userRepository) { }
}

因此,它是完全可测试的,因为您可以在测试中进行模拟IUserRepository

于 2012-03-31T11:53:13.663 回答
1

虽然本文提到使用实体框架的可测试性,但这里可以应用高级概念。

示例的核心概述了使用“工作单元”模式和“存储库”模式。工作单元是围绕数据上下文的抽象,表示特定控制器或一组类似控制器的工作集。您可以在单元中包含多个存储库,并且由于存储库基于IEnumerableIQueryable您仍然可以利用 LINQ 功能。

可测试性选项包括模拟单元和存储库,或为测试目的创建内存表示。

于 2012-04-01T16:54:28.457 回答