2010-12-02 5 views
2

이 생성자 : 당신이 도와 주실 수의존성 주입 및 단위 테스트 나는 클래스의 생성자와 속성이

private IMyCollectionObjects _myCollectionObjects; 

public MyClassConstructor(string message) 
{ 
    _myCollectionObjects = MyCollection.GetCollectionObejects(message); 
} 
  1. 많은 세부 나를 이해하는 방법을 단위 테스트이 생성자 및 GetCollectionObjects 메서드?

  2. 클래스를 어떻게 완벽하게 분리합니까? 당신은 어떤 IoC를 사용하여 대답을 줄 수 있습니다, 나는 개념을 이해하고 싶습니다.

감사합니다.

+1

+1 물어볼 자격이 있습니다. =) –

답변

1

단위 테스트는 모두 단위 테스트, 즉 한 번에 한 가지 테스트에 관한 것입니다. 많은 세부 사항

당신은 나를 어떻게 단위 테스트이 생성자 및 GetCollectionObjects 방법을 이해하는 데 도움이 바랍니다 수 있습니까?

첫 번째 사항은 먼저 기기를 MyCollection 클래스 테스트를 받았습니까?

그렇지 않은 경우 종속성 삽입의 기본이되는 MyClassConstructor 클래스에 따라 시작해야합니다. 그렇지 않으면, 결과가 옳고 그른지를 어떻게 알 수 있습니까? 당신은 테스트를 할 수 없으며 그것이 완벽하게 작동하는지 확신 할 수 없습니다.

클래스를 어떻게 완벽하게 분리합니까? IoC를 사용하여 대답을 줄 수 있습니다. 개념을 이해하고 싶습니다.

내 겸손한 관점에서, 의존성 주입을 사용하여 다른 객체에 종속적 인 객체를 만들어야하는 분명한 이유가 있어야합니다. 객체를 다른 객체에 의존하게하면, 제 생각에 객체를 분리 할 수 ​​없습니다. 디커플링의 한 가지 방법은 엔터프라이즈 라이브러리의 Unity Application Block을 사용하는 것입니다.

단위 테스트

당신은 일반적으로 그러한 생성자를 테스트하는 동안 세 가지를 확인하기 위해 필요한이 생성자.

  1. 생성자가 null 값을 반환하지 않는다.
  2. 반환하는 인스턴스의 유형이 예상됩니다.
  3. 종속성을 통해 인스턴스화 할 것으로 예상되는 개체가 실제로 시작됩니다.
 
    [TestCase("message")] 
    public void DependentConstructorTest(string message) { 
     MyClassConstructor myclass = new MyClassConstructor(message); 

     Assert.IsNotNull(myclass); 
     Assert.IsInstanceOf(typeof(MyClassConstructor), myclass); 
     Assert.IsNotNull(myclass.MyCollection); // Where MyCollection represents the property that 
               // exposes the instance created of the object from 
               // which your MyClassConstructor class depends on. 
    } 

:이 시험은 NUnit과 속성과 주장 방법을 사용하여 작성됩니다. 다른 사람이 좋아하는 것을 사용하십시오.

1

다음은 대략 가정 할 때 필요한 사항입니다.

MyCollection이 정적 클래스이고 GetCollectionObjects가 문자열을 파싱하고 IMyCollectionObjects를 반환한다고 가정하면 먼저 MyCollection을 비 정적으로 만들고 생성자를 통해 전달해야합니다. 클래스에서 사용되는 정적 클래스/메소드는 정의에 따라 어느 정도 긴밀한 결합을 만듭니다.

이제 메시지 문자열과 MyCollection을 전달하는 클래스를 생성하게됩니다. 생성자는 두 개를 조합하여 IMyCollectionObjects 유형의 멤버 변수를 채 웁니다. 이러한 일이 예상대로 이루어 지려면 수업 외부의 결과 (예 : 공개 메소드)를 검토 할 방법이 필요합니다. 따라서 _myCollectionObjects를 노출하는 속성 getter가 필요합니다.

이제이 생성자를 하나 이상의 테스트에서 호출하고 생성 후 속성을 검사하여 문자열을 구문 분석하여 컬렉션에 성공했는지 확인해야합니다.

이것은 개별 단위 테스트보다 더 많은 통합 테스트입니다. 구문 분석이 성공적으로 수행되었는지 테스트하고 있습니다. 여기에 표시된 클래스가 실제로 테스트하려는 클래스 인 경우 테스트는 실제로 GetCollectionObjects가이라는 임을 확인하는 것입니다. 이 호출의 결과는 별개의 테스트 또는 테스트 세트가 있으므로 (아마도) MyCollection의 GetCollectionObjects 메서드가 예상대로 작동하기 때문에 실제로는 관련이 없습니다.

3

GetCollectionObjects과 같은 정적 멤버에 대한 종속성은 런타임에 해당 구현을 바꿀 수 없기 때문에 테스트하기가 어렵습니다. 즉 MyClassConstructor의 인스턴스를 구현 세부 사항 GetCollectionObjects에서 완전히 분리 할 수 ​​없습니다. 테스트 대상을 분리하지 않으면 실제로 단위 테스트로 간주 할 수 없습니다.

See here for further discussion of static dependencies.

당신이 코드가 완전히 분리 된 (따라서 완전히 검증) 할 리팩토링 할 수

이 잘 MyClassConstructor에서 모음에 메시지를 설정하는 방법에 대한 지식 거품
private readonly IMyCollectionObjects _myCollectionObjects; 

public MyClassConstructor(IMyCollectionObjects myCollectionObjects) 
{ 
    _myCollectionObjects = myCollectionObjects; 
} 

, 클래스를보다 간단하고, 응집력 있고, 덜 결합하게 만듭니다.