2012-12-06 3 views
1

2 개의 프로젝트에 대해 C#으로 클래스 라이브러리를 구축하고 있습니다. 이 클래스 라이브러리는 SQLServer 데이터베이스에 대한 많은 연결을 수행합니다.mock static 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 one]과 같은 기사를 읽는 것이 좋습니다 (http://www.programmersranch.com/2013/09/c-mocking- and-dependency-injection-for.html)을 참조하십시오. – StriplingWarrior

관련 문제