2009-12-08 6 views
5

Linq To SQL 코드의 단위 테스트를 설정하려고합니다. 내 코드는 System.Data.Linq.Table 클래스 (디자이너가 생성)를 사용합니다.Typemock은 Linq To SQL Table 클래스를 모의 할 수있는 유일한 프레임 워크입니까?

이 클래스는 봉인되었고 생성자는 내부이므로 완전히 impervious to unit testing frameworks like Rhino Mocks입니다. (당신이 저장소 패턴을 사용하도록 코드를 변경하고 싶지 않다면, 나는 그렇지 않을 것입니다.)

Typemock은 (어떤 방법으로)이 클래스를 모의 할 수 있습니다. (예를 들어, here을 참조하십시오.)

그러나 Typemock은 라이센스가 $ 800입니다. 나는 곧 고용주가 그 일로 떠오르는 것을 보지 못한다.

그래서 여기에 질문이 있습니다. 모의 객체를 만들기 위해 인터페이스에 의존하지 않는 다른 모조 프레임 워크가 있습니까?


편집 : 코드의 예 내가 시험에 필요

public class UserDAL : IUserDAL 
{ 
    private IDataClassesDataContext _ctx; 
    public UserDAL() 
    { 
     string env = ConfigurationManager.AppSettings["Environment"]; 
     string connectionString = ConfigurationManager 
            .ConnectionStrings[env].ConnectionString; 
     _ctx = new DataClassesDataContext(connectionString); 
    } 
    public UserDAL(IDataClassesDataContext context) 
    { 
     _ctx = context; 
    } 
    public List<User> GetUsersByOrganization(int organizationId) 
    { 
     IOrderedQueryable<User> vUsers = 
      (from myUsers in _ctx.Users 
      where myUsers.Organization == organizationId 
      orderby myUsers.LastName 
      select myUsers); 
     return vUsers.ToList(); 
    } 
    public bool IsUserInOrganization(User user, int orgainzationID) 
    { 
     // Do some Dal Related logic here. 

     return GetUsersByOrganization(orgainzationID).Contains(user);    
    } 
} 

나는 쉽게 읽을 수 있도록이를 단락있다. 아이디어는 내가 몇 가지 코드를 가지고있다 (A LINQ 쿼리를 수행 다른 방법을 (GetUsersByOrganization을 같은)를 호출 IsUserInOrganization을있다.

I는 단위 테스트 IsUserInOrganization 방법을하고 싶습니다. 내가 _ctx.Users을 조롱 할 필요가 있음을합니까 . - 종속 관계가에있는 경우

1) 플랫폼을 테스트하지 마십시오 : 두 개의 표준 단위 테스트가이 경우에 접근 테이블 클래스 (즉 밀봉 내부 생성자가있다)

+0

두 노트 : 1. 테스트 IsUserInOrganization은 일반적으로 통합 테스트를 제외하고 GetUsersByOrganization 테스트를 분리해야한다; 그들은 같은 일을하지 않습니다. GetUsersByOrganization 테스트에는 일반적으로 IsUserInOrganization의 특정 사용 범위가 포함됩니다. IsUserInOrganization 메서드에 몇 가지 추가 코드가 없으면 GetUsersByOrganization 테스트가 관련 사례를 포함해야하므로이 메서드를 테스트 할 이유가 없습니다. 기본적으로이 경우에는 잘못된 것으로 테스트하고 싶습니다. –

+0

하나가 다른 하나를 호출합니다. 그것을 다른 수업으로 내 보내서 다른 학생에게 전화하지 않고 어떻게 시험 할 수 있습니까? – Vaccano

+0

수 없습니다. 사실 그것은 코드 냄새입니다. –

답변

4

체크 아웃의 간단한 전제가 Microsoft Stubs :

자신의 대표와 모든 .NET 방법을 바꾸기를!

더 자세한 기능 설명 (강조는 내 것임).

스텁 전적으로 위임에 따라 입니다 .NET에서 테스트 스텁 및 우회를위한 경량 프레임 워크가 입력 안전, refactorable 및 소스 코드 생성. 디자인 된 스텁은 PEX 흰색 상자 분석에 대한 최소한의 오버 헤드, 코드 계약 런타임 작가를 지원하고 이 프로그래밍 모델 보다는 기록/재생 테스트를 장려 을 제공합니다. 봉인 된 유형의 가상/정적이 아닌 메소드를 포함하여 모든 .NET 메소드에서 스텁을 사용할 수 있습니다. 코드에 대한

+0

스텁이 'Moles' – Peli

+0

-1로 이름이 바뀌 었습니다. Moles를 사용하여이 작업을 수행 한 결과 매우 어려웠습니다. TypeMock 일 때 Mock mockDC = MockManager.Mock (typeof (CustomerServicesDataContext)); mockDC.ExpectGetAlways ("Categories", mockCats); --- 2 줄의 코드 (mockCats 객체를 만드는 것)! – jcollum

+1

@jcollum, 대답을 downvoting에 대한 꽤 얇은 인수지만, 당신이 원하는대로 할. 그러나 사이드 노트에서 TypeMock보다 쉬웠다 고 말한 적은 없었습니다. TypeMock 라이센스를 가지고 있다면 ... 사용하십시오. 그러나 모든 사람이 가지고 있다고 가정하지 마십시오. –

2

있습니다되는 프레임 워크 클래스에서는 상호 작용이 확인 된 테스트를 작성하지 않습니다. 이것은 일반적으로 테스트 시간에 의존성을 대체한다는 것을 의미하지만, 경우에 따라 테이블 자체를 주입한다는 의미입니다.

2) 플랫폼 랩 - 당신은 플랫폼과 상호 작용 뭔가를 테스트해야하는 경우, 다음 통합 및 고려 테스트 수용도있어 관련 부품

에 대한 래퍼 층 물품. 이 두 경우 모두 일반적으로 응용 프로그램에 존재하는 종속성을 받아들입니다.

이 수업을 직접 조롱하거나 대체해야 할 필요가있는 것은 무엇입니까?

편집 : 당신이 더 많은 테스트 가능 코드를 다시 작성 피하기 위해 찾고있는 것처럼

것 같다. 이것은 TypeMock이 탁월한 부분이며, 일부 테스트 지지자가 TypeMock이 문제를 일으킬 수 있다고 생각하는 이유입니다. 그러나 테스트 가능성을 위해 코드를 재구성하는 것을 절대적으로 거부하는 경우 작업에 적합한 도구입니다.

편집 # 2 :

아마도 나는 이것에 대해 지나치게 강박 관념에 사로 잡힌 존재하지만, 이제 더 검증 패턴을 고려하지 할 수있어 : 사용자가 더 이상 플랫폼이 될 필요가에 대한

Organization() 
{ 
    HasUser(name) 
} 

OrganizationDAL 
{ 
    Organization LoadOrganization(id) 
} 

OrganizationServiceFacade 
{ 
    IsUserInOrganization(name, orgid) 
    { 
     return OrgDAL.LoadOrganization(id).HasUser(name) 
    } 
} 

기구의 자연적인 테스트를 포함을 의존성, 당신은 데이터 소스를 주입 할 수 있어야합니다.OrganizationDAL은 조직에 대한 정보를 반환하기보다는 조직을로드하는 책임이 있습니다 (필요한 경우이 계층에 쿼리를 넣는 방법이 있지만). OrganizationServiceFacade는 작성된 서비스를 제공 할 책임이 있으며, 래퍼 클래스이기 때문에 모의 (mockability)를 충족시켜야하고 추가 단위 테스트 (통합 또는 가능하게는 수락 대상이기도 함)가 필요하지 않습니다. 조직 구성 방법에 따라 데이터가 어떻게 작동하는지에 대한 특정 개념에 의존하지 않고 데이터를 주입 할 수 있습니다.

+0

나는 플랫폼을 감쌌다. 프레임 워크가 올바르게 작동하는지 테스트하는 것은 책임지지 않습니다. –

+0

테스트에 대해 우려하고있는 것을 보여주기 위해 질문에 더 추가했습니다. – Vaccano