2011-02-14 5 views
1

테스트 클래스에 대한 모의 저장소를 초기화하는 일반적인 방법을 찾으려고합니다. 내가 여러 저장소를 가지고 있기 때문에 제네릭을 사용하여 그것을 시도했다.제네릭을 사용하여 조롱 된 저장소를 초기화하는 더 좋은 방법이 있습니까?

public interface IRepository<T> where T: class 
{ 
    IQueryable<T> GetAll(); 
} 

내 정적 초기화 방법은 다음과 같습니다 :이 아니다

Mock<IRepository<Link>> linkRepository = UnitTestHelpers.GetRepository<IRepository<Link>, Link>(new[] { 
    new Link { LinkId = 1, Title = "Title 1", Created = DateTime.Now, Url = "http://google.com" }, 
    new Link { LinkId = 1, Title = "Title 2", Created = DateTime.Now, Url = "http://google.com" }, 
    new Link { LinkId = 1, Title = "Title 3", Created = DateTime.Now, Url = "http://google.com" } 
}); 

내 기분이 :

public static Mock<T> GetRepository<T, TK>(params TK[] items) where T: class, IRepository<TK> where TK: class 
{ 
    Mock<T> mock = new Mock<T>(); 
    mock.Setup(m => m.GetAll()).Returns(items.ToList().AsQueryable); 
    return mock; 
} 

은 내가 사용하는 코드에서 내 저장소를 초기화하려면 나는 일반적인 저장소 인터페이스가 GetRepository 메서드에서 Link를 두 번 지정해야하므로이 작업을 수행하는 가장 우아한 방법입니다. 이 작업을 더 멋지게/깨끗하게 할 수 있습니까?

답변

1

예,이를 달성하는 데 약간 더 부드러운 방법이 있습니다. Link 유형 매개 변수가 중복되는 것은 언급했듯이 일반 유형 IRepository<T>을 매개 변수화 할 실제 필요가 없기 때문입니다. 이

public static Mock<IRepository<T>> GetRepository<T>(params T[] items) where T: class { 
    Mock<IRepository<T>> mock = new Mock<IRepository<T>>(); 
    mock.Setup(m => m.GetAll()).Returns(items.ToList().AsQueryable); 
    return mock; 
} 

일부 관련이없는 힌트를보십시오 : 정말 이 필요하지 않는

  • ToList() 전화를 놓습니다. lazyness 및 향상된 가독성을 추가합니다.
  • DateTime.Now이 아닌 DateTime을 사용하여 repeatable 단위 테스트를 만듭니다.
+1

도움 주셔서 감사합니다. 나는 이것을 내일 시도 할 것이다. 반복 가능한 테스트에 대한 조언도 감사드립니다. – b3n

+0

@ b3n np. 행운? – vidstige

+0

죄송합니다. 직장에서 너무 바빴으니 주말에 다시 방문해야합니다. 너에게 알려 줄거야. – b3n

관련 문제