2009-08-17 3 views
9

메소드 연결을 통해 약간의 유창한 인터페이스를 만들었습니다. 이들은 일반적으로 웹 서비스/데이터베이스에서 데이터를 가져 오는 여러 저장소를 호출합니다.Fluent 인터페이스를 사용하는 단위 테스트 코드는 어떻게 작성합니까?

유창한 인터페이스를 사용하는 단위 테스트 방법은 어떻게해야합니까? 내가 단위 테스트에 내가 무엇을해야하는지 위의 FindComputers 방법을 원하는 경우

Public IEnumberable<Computer> FindComputers(string serialNumber) 
{ 
     return Computers.FindBySerialNumber("YBCX00900") 
     .AttachConfiguration() 
     .EnsureAllComputersHaveConfiguration(); 
} 

나는 단위는 유창 인터페이스의 개별 구성 요소를 테스트 할 수 있지만?

  1. 사용하여 유창 인터페이스의 구체적인 구현 및 저장소 클래스
  2. 모의 유창 인터페이스 자체에 기대를 작성하고는 FindComputers을 그
  3. 시험에만 유창 인터페이스 자체에 대한 기대치를 설정, 그리고() 메서드

쉽게 유지 관리 할 수있는 방법을 찾고 싶습니다.

답변

3

나는 FI가 필요 이상으로하고 있다고 생각합니다. 난 당신이 데이터 매퍼로 컴퓨터를 사용하고 또한 쿼리를 작성하는 데 사용하는 것으로 가정합니다. 당신이 표시된 것을에서 쿼리는이에서 구축된다

rule 1: find configured computer with serial number = "whatever" and has-config = true. 
rule 2: find not-config computer with serial number = "whatever and has-config = true. 
rule 3: find configured computer with serial number = "whatever" and has-config = false. 
rule 4: find not-config computer with serial number = "whatever" and has-config = false. 
rule 5: find all computer with serial number = "whatever" and has-config = true. 
rule 6: find all computer with serial number = "whatever" and has-config = false. 

등등 ...

을 이제 구현 될 수 이러한 규칙 중 일부는 잘못된 것 같다. 규칙 2와 규칙 3은 교차 목적으로 보인다. 규칙 5와 규칙 6은 무엇을합니까? 이게 맞나요?

SRP를 깨는 개체를 구현했기 때문에. 첫 번째 단계는 쿼리 작성기를 데이터 매퍼에서 분리하는 것입니다. FI 쿼리 개체를 작성한 다음 매퍼에 전달합니다.

이제 FindComputers을 테스트하여 FI 쿼리 개체가 데이터 매퍼로 전송되도록 할 수 있습니다. 이제 FI 쿼리 개체를 만들 수 있으므로 테스트 할 수 있습니다. 또한 데이터 매퍼가 쿼리 개체를 사용하는지 테스트 할 수 있습니다.

나중에 위치별로 컴퓨터를 찾으려면 어떻게해야합니까? 동일한 코드를 작성했다면, FindByLocation을 추가해야하고 신 오브젝트가 있다는 것을 알기 전에 작성해야합니다. 냄새 나는! 입력에 대한

+0

감사합니다. 당신이 예를 잘못 생각해 왔습니다. FI를 하나의 쿼리로 분해하고, 하나는 반환 된 데이터에 대한 연산을 수행하는 것입니다. 필자는 FI를 단위 테스트하는 것이 가장 쉽다는 것을 발견했으며, FI를 구체적인 구현으로 사용하는 단위 테스트 메서드를 발견했습니다. 원하는 결과가 리턴되는지 테스트하십시오. FI를 조롱하려고하면 테스트가 너무 부서지기 쉽습니다. – Andronicus

0

나는 2 + 3을 할 것입니다. 유창한 인터페이스가 진정한 인터페이스라고 가정하면 모의하기가 비교적 간단해야합니다. 호출 체인의 각 단계가 아마도 새로운 mock 객체를 반환해야한다는 것을 알면, 차례로 다음 호출을 기다리고있을 것입니다.

그래도 유창한 인터페이스를 직접 테스트해야하며 그 아래의 저장소 계층을 조롱해야합니다.

+0

덕분에, 내가 유창 인터페이스 자체를 조롱 생각하지만, 단지 가 기대 ... 같은 테스트를 작성하는 이상한 것 같다 (X => x.FindBySerialNumber (NULL)).Return (nextMock) Expect (x => x.AttachConfiguration()) Return (nextMock) 모든 테스트는 호출이 실제로 이루어 졌을 때 수행합니다. 모의 객체에서 전체 유창한 인터페이스를 재현하고 테스트중인 메소드에 이미 명확하게 작성된 것을 테스트하는 작업은 많은 작업입니다. – Andronicus

+0

저는 단위 테스트 커버리지를 처음 사용하고 있으며 때때로 동일한 품질 보증을합니다. 검사로 코드를 검토하기 쉽지만, 여전히 수동 검토입니다. 테스트 커버리지를 추가하면 더 이상이 클래스에 대해 생각하지 않을 때 길을 보호 할 수 있습니다. 이것은 유창한 인터페이스가 필요한 것보다 더 복잡하다는 표시 일 수도 있습니다. 인터페이스가 더 필요한 곳에 초점을 맞추면 테스트가 더 간단하게 쓰일 수 있습니다. –

1

리포지토리를 조롱 할 수 있습니까? 어떤 사람들은 한 클래스의 한 메소드를 분리해야하는보다 순수한 접근법을지지하지만, FindComputers와 유창한 인터페이스가 어떻게 연동하는지 테스트하는 훌륭한 방법이 될 것입니다. 그리고 Repository 액세스 레이어의 모양에 따라 더 간단 할 수도 있습니다.