2012-12-06 58 views
1

我正在C#中为两个项目构建一个类库。这个类库与SQLServer数据库有很多连接。模拟静态C#数据库类

,因为这个库只是从SQLServer数据库,以便有一个静态类是负责的负载连接设置并打开它检索数据。然后库的类接收所需的数据来执行查询并返回结果。所有这些都是使用静态方法完成的。

就是这样。

internal static class DBConnection 
{ 
    private const String connectionString = "some connection string"; 
    public static SqlConnection open() { /* ... open the connection ... */ } 
} 

public static class DataXRetriever 
{ 
    public static List<DataX> RetrieveById(Int32[] ids) 
    { 
     using (SqlConnection connection = DBConnection.open()) 
     { 
      /* ... do a query ... */ 
      /* ... do something with the result of the query ... */ 
      /* ... return it ... */ 
     } 
    } 

    /* ... some other static methods ... */ 
} 

我想要做一个测试单元,这些样的方法,而不需要被连接到数据库中,我一直在阅读,这是可以做到实例包含连接类,并给它将使用它的类,但是我的设计不能像那样工作。

+5

这就是为什么你不应该使用静态类或单例。 – SLaks

+0

添加到StriplingWarrior的答案,看看Ninject(依赖注入)。你明确地根据接口进行编程。 http://www.ninject.org – Fredrik

回答

1

您可能允许代码修改连接字符串,而不是使其成为静态的,然后让你的单元测试设置代码在运行测试之前改变它的值。 (更新:关于第二个想法,对于具体的事情你正在试图做的,即使这样,也没有真正的工作

但要做到这一点正确方式是针对接口编程是那些获得注入进入你的班级,这样他们可以很容易地在个案的基础上嘲笑。

换句话说,如果你的设计“不喜欢那个工作”,那么你的设计是错误的,它需要改变。

+0

恩,谢谢。也许这可以帮助我说服改变项目的设计。 – Vraiment

+0

@StriplingWarrior:请你举例说明这个概念吗? –

+0

@JesonMartajaya:我现在没有时间写一个例子,但我建议阅读[this]这样的文章(http://www.programmersranch.com/2013/09/c-mocking- and-dependency-injection-for.html)来获得一般想法。 – StriplingWarrior