2011-08-05 2 views
0

우리는 우리가 다음과 유사한 할 우리의 코드베이스에 여러 곳이 우리가 우리를 제거 MOQ 같은 모의 테스트 프레임 워크를 사용할 수있는 방법비웃음 System.Data.SqlClient.X 클래스

DataTable dt = new DataTable(); 
using (DatabaseContext context = DatabaseContext.GetContext(false)) { 
    IDbCommand cmd = context.CreateCommand("SELECT * FROM X"); 
    SqlDataAdapter dataAdapter = new SqlDataAdapter((SqlCommand)cmd); 
    dataAdapter.Fill(dt); 
} 
return dt; 

을 데이터베이스에 대한 종속성 테스트? 반환되는 DataTable을 조롱하고 싶습니다.

명확한 설명 : 우리는이 코드를 변경할 계획이 있지만 현재 수 없습니다. 전혀 모의하는 것이 가능합니까?

+0

당신이이 코드를 사용하여 데이터 테이블을 조롱하지 못할 수 있습니다 MOQ 또는 코뿔소처럼 무료 조롱 프레임 워크를 사용합니다. 그러나이를 달성하기 위해 Typemock이나 JustMock을 살펴볼 수 있습니다 (그러나 이것들은 값 비싼 옵션입니다). – Raghu

답변

1

코드를 변경할 수 없기 때문에 큰 리펙터를 수행 할 수 없습니다. 여기 제가 제안하는 바가 있습니다.

  1. 추출 코드 당신은 방법에 제공했다.
  2. 이 그것
  3. 재정의 방법을 예를
  4. 에 대한 OriginalClassNameTesting이 방법와 이름을 포함하는 클래스로부터 보호 또는 공공
  5. 상속하지 않는 경우
  6. 는 가상 확인하고 당신은 wan't 어떤 DataTable을 반환
  7. 에서 테스트에서는 OriginalClassNameTesting 클래스 대신 OriginalClassNameTesting 클래스를 사용합니다.

이 패턴을 '추출 및 재정의'라고하며 위대한 책에 많이 나온 것 중 하나 인 http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052입니다.

일부

당신은 단지 테스트를위한 가상 메서드를 추가하는 것을 좋아하지 않을 수 있습니다. 그래서, 이것은 단지 첫 걸음입니다. 당신은 리팩토링 계획이 있다고하셨습니다. 그렇다면 시험을 치르는 것이 중요 할 것이므로 아무 것도 제동하지 않았 음을 확신 할 수 있습니다. 그리고 자바에있는 모든 방법은 기본적으로 가상 (또는 내가 잘못입니까?)

2

나는 저장소 내에서 모든 데이터베이스 특정 코드를 숨 깁니다 Repository 패턴을 사용하는 것이 좋습니다 것입니다. 위의 계층에서 논리를 테스트하기 위해 저장소를 조롱 할 수 있습니다.

는 데이터를 검색하고 가 모델에 작용하는 비즈니스 로직에서 개체 모델에 매핑 로직을 분리하는 저장소를 사용합니다. 비즈니스 로직은 이 데이터 소스 계층으로 구성된 데이터 유형에 대해 불가지론 적이어야합니다. 예를 들어 데이터 소스 계층 은 데이터베이스, SharePoint 목록 또는 웹 서비스 일 수 있습니다.

저장소는 데이터 소스 층 및 비즈니스 애플리케이션의 층간 중재. 이 데이터에 대한 데이터 소스, 는 비즈니스 엔티티 데이터 소스에서 데이터를 매핑 쿼리 및 데이터 소스에 사업체에서 변화를 지속. 저장소 은 기본 웹 데이터 소스 또는 웹 서비스 인 과의 상호 작용에서 비즈니스 논리를 분리합니다.

+0

예, 가능한 한 빨리 이걸 옮기고 싶습니다. 현재이 코드를 변경할 수는 없으므로 모의 할 수있는 방법이 있습니까? 나는 그 질문에서 분명히 할 것이다. –