문제

ClientAdministrators 테이블에 의해 다대다 관계로 연결된 Clients와 Administrators라는 두 개의 테이블이 있습니다.

실제 애플리케이션에서는 이 기능이 제대로 작동하며 내 클라이언트의 관리자 목록을 얻을 수 있습니다.내 문제는 저장소에서 이를 검색하는 서비스 클래스를 단위 테스트하려고 할 때 발생합니다.

내 저장소 인터페이스를 구현하는 FakeRepository 클래스가 있고 쿼리할 서비스 클래스에 대한 여러 내부 개체 목록이 있습니다.

내 문제는 이 다대다 관계에 대해 성공적으로 쿼리할 수 있도록 가짜 클래스에서 관계가 작동하도록 하는 방법을 찾을 수 없다는 것입니다.

Dim clients = From c in _repository.GetAllClients _
              Select New ClientBizObj With {.ID = c.ID, _
                                            .ClientName = c.ClientName, _
                                            .Admins = (From a in c.ClientAdministrators _
                                                       Select a.Administrator.UserName).ToList}

c.ClientAdministrators가 EntitySet(ClientAdministrator의)이라는 메시지가 표시됩니다.

NullReferenceException이 발생하지 않도록 FakeRepository 클래스에서 이 관계를 어떻게 위조할 수 있나요?

관리자를 반환하지 않아도 상관없습니다. 성공적으로 반환되려면 클라이언트 개체만 있으면 됩니다.

도움이 되었습니까?

해결책

귀하의 예에서는 데이터베이스 작업 자체가 아닌 데이터 액세스 계층을 구체적으로 조롱하려고 합니다.이는 지속성 문제로부터 논리를 분리하기 위한 단위 테스트에서 완벽하게 합법적입니다.

설명하신 문제는 Clients 클래스의 모형을 생성하여 해결할 수 있습니다.이 모의에서는 ClientAdministrators 속성을 재정의하여 빈 컬렉션을 반환하면서도 다른 모든 것을 실제 클래스에 위임할 수 있습니다.그런 다음 실제 Clients 클래스 대신 모의 객체를 반환하려면 FakeRepository 클래스가 필요합니다.

이를 쉽게 하기 위해 여러 가지 조롱 도구가 존재합니다.이 중에서 가장 사용하기 쉬운 것(그리고 부팅할 수 있는 오픈 소스) 중 하나는 다음과 같습니다. moq.moq를 사용하면 테스트를 위해 모든 데이터 액세스 계층을 모의할 수 있으므로 자신만의 FakeRepository 클래스를 구축할 필요도 없습니다.

다른 팁

이것이 그 이유 중 하나일 것입니다. 로이 오셰로브 (TypeMock의 수석 설계자이자 "The Art of Unit Testing"이라는 책의 저자)는 데이터베이스 작업을 조롱하지 말 것을 권장합니다.그는 그러한 테스트를 수행할 것을 권장합니다. 통합 테스트로 이관됨, 실제 데이터베이스가 이러한 테스트에 포함되어야 합니다.

Dev Magic Fake를 사용하여 DB를 조롱하지 않기 위해 DB를 가짜로 만들 수 있습니다. 즉, 다음을 수행하여 UI를 조롱 할 수 있습니다.

[HttpPost]
public ActionResult Create(Client model)
{
   var repository = new FakeRepository<Client>();
   repository.Save(model)

자세한 내용은 CodePlex의 DevMagicFake를 참조하세요.

devmagicfake.codeplex.com

감사해요

M.라드완

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top