2010-11-22 5 views
1

나는 TDD와 함께 작년에 Moq와 Rhino Mock을 사용 해왔다. 나는 이런 식으로 발전하는 것을 정말로 즐겼지만, 내가해야 할 일이 아니라고 생각하는 프로젝트의 한 부분으로왔다.비즈니스 계층을 테스트하는 방법은 무엇입니까?

필자는 테스트를 거쳤으며 내 디자인을 몰아 냈고 모든 것이 잘 동작합니다. 이제는 테스트해야하는 객체 위에 레이어가 있습니다. 필자는 인터페이스를 통해 Inversion of Control을 사용하여 여러 객체를 가지고 있기 때문에 이러한 모든 서비스를 스텁 및 조롱하는 것은 많은 일처럼 보입니다. 한 가지 테스트에서 코드를 테스트하기 전에 적어도 8 가지 서비스를 완성해야합니다. 단지 실제 이익이없고 많은 노력이 필요한 많은 코드를 작성하는 것처럼 보입니다.

제 질문은 "이 작업을 수행하는 더 좋은 방법이 있습니까?" 이것은 행동 주도 설계 또는 다른 방법론이 실제로 단위 테스트를 수행하지 않는 것처럼 더 적합한가?

+0

"서비스"란 무엇입니까? WCF 서비스? – Simone

+0

나는 내 질문을 수정했다. 나는 어떤 일을하는 물건에 서비스를 의뢰했다. 혼란을 드려 죄송합니다. –

+0

같은 '문제'를 마주보고 때로는 한 줄을 테스트하기 위해 100 줄의 코드를 설정해야하는 것처럼 보입니다. 그리고 그것은 테스트 코드를 재사용하기가 어렵습니다. 저는 – Michel

답변

1

8 개의 서비스가 필요한 경우 8 개의 스텁/가짜가 필요합니다. 나는 네가 이것을 피할 수 있다고 생각하지 않는다.

코드를 줄이려면 단위 테스트를 리팩토링하고 계층 구조 또는 8 개의 모든 서비스 설정 코드를 그룹화하는 데 적합한 다른 OO 필수품을 만들 수 있습니다.

편집

Otherways을, 당신은 "megaobject"을 만들 수 있습니다. 8 개의 서비스가 각각 다른 인터페이스를 구현한다고 가정 해 보겠습니다. IService1, IService2 등등. 단위 테스트에서는 각 서비스의 인터페이스를 그룹화하는 인터페이스를 만들 수 있습니다.

interface ISuperInterface: IService1, IService2, ... { } 

그러면 하나의 객체 만 모방하면됩니다.

+0

감사합니다 시몬, 당신이 그렇게 말할 것 같았습니다. 나는 도움이되는 설정 섹션에 많은 코드를 넣었다. BDD 등의 다른 형태의 테스트가이 레이어에서 더 잘 될지 궁금합니다. –

+0

업데이트가 도움이되는지 확인하십시오. – Simone

+0

니스, 내가 그것에 대해 언급했을 때 생각하고있었습니다. 나는 TDD가 작동하는 방식을 좋아하며, 많은 계층을 필요로하는이 계층에서도 TDD가 최선의 방법이라고 확신한다. –

3

드문 경우지만에만 8 개의 다른 클래스에 따라 수업을 진행하게됩니다.

제 경험상 MVVM의 ModelView만이 엄청난 의존성을 가질 수 있습니다. 기타 서비스에 대한 의존성이있는 비즈니스 로직이 있다면 리팩토링 코드가 필요하다고 생각합니다.

아이디어는 단일 책임의 원칙이지만 더 많은 클래스를 갖지만 코드는 적습니다.

+0

객체, datetimeservice, 요청 된 객체에 대한 다양한 저장소, sessionService 등을 로깅했습니다. 이러한 모든 서비스/객체는 SRP와 일치합니다. 내가 가지고있는 것보다 더 리팩토링 할 수있는 방법이 확실하지 않습니다. 스터 빙과 조롱은이 레이어에서 너무 많은 작업처럼 보입니다. –

+0

그렇다면 그것은 드문 경우 중 하나입니다. – Aliostad

1

단위 수준의 BDD는 다른 무엇보다 사고 방식과 어휘에 관한 것입니다. "test"라는 단어를 사용하지 않고 학급에 관해 생각한다면 책임과 행동에만 집중하면 잘못되었을 수도있는 것을 해결하는 데 도움이됩니다. 나는 당신의 직업이 8 가지 서비스를 필요로한다면 너무 많은 책임이 있다고 생각합니다. 그 책임 중 일부를 다른 수업에 위임 할 수 있겠습니까?

시나리오 수준의 BDD는 실제로 전체 시스템의 동작, 범위 및 책임에 대해 생각하고 주위에서 대화하는 데 도움을주기위한 것입니다. 나는 그것이 당신이 말하는 수업의 디자인을 해결하는 데 도움이 될 것이라고 생각하지 않습니다. 그러나 BDD가 모자라면 테스트에 관한 것이 아니라고 말할 수 있습니다. 그것은 무지를 발견하고,이를 해결하고, 지식을 전달하여 코드를 쉽고 안전하게 변경할 수있게하는 것입니다.

코드를 변경하기 쉽고 안전하도록 만드는 것이 좋습니다.누군가가 무언가를 바꿀 때 처음으로 깨지기 쉬운 부서지기 쉬운 시험을 쓰고 있다면, 네, 어쩌면 그것을 시나리오와 시스템 행동으로 넘어갈 수도 있습니다. 그렇지 않으면 @Aliostad가 제안하는 것처럼 더 멋진 유닛 레벨 예제를 작성하고 코드를 리팩토링하십시오.

+0

BDD에 대한 설명 주셔서 감사합니다. 당신은 "레벨을 대신 사용하십시오"라고 말했습니까? 여기에서 의미하는 바를 더 설명 할 수 있습니까? –

+0

BDD는 많은 수준의 세분화 수준에서 작동하며 주로 만들려는 소프트웨어에 대해 모르는 내용을 발견하기위한 것입니다. 예를 들어, 프로젝트 비전 수준에서 우리는 프로젝트를 통해 달성해야 할 것을 바라보고, 우리가 놓치고있는 시장 환경에 대해 뭔가 있는지를 고려합니다. 그 아래에는 이해 관계자 목표, 기능 세트, 기능, 이야기, 시나리오, 코드가 있습니다. "단위 행동"의 수준이 "시나리오"이므로이 경우에 그 의미가 있습니다. 그에 따라 편집하십시오! – Lunivore

+0

도움을 주셔서 감사합니다. 저는 Simone의 대답을 들었지만 제공 한 도움에 정말로 감사드립니다. –

관련 문제