2013-02-21 3 views
0

클래스를 상속하면 클래스를 테스트하는 것이 더 쉽다는 것을 발견했습니다. 이 seudo의 예를 고려해Unittest가 Dispose를 사용하여 대상 (SUT)에서 상속

public class Bizz 
    { 
    public void Do() 
    { 
     var obj = ExtenOutOfTest(); 
     someList.Add(obj); 
    } 

    protected List<ISomeObejct> someList = new ISomeObejct<ISomeObejct>(); 

    protected virtual ISomeObejct ExtenOutOfTest() 
    { 
    //return real obejct 
    } 
    } 

및 테스트는 다음과 같이 보일 것이다 :

[TestClass] 
    public class BizzTest : Bizz 
    { 
    private ISomeObejct _fakedObj; 

    protected override ISomeObejct ExtenOutOfTest() 
    { 
     return _fakedObj; 
    } 

    [TestMethod] 
    public void Test_Do_Add() 
    { 
     _fakedObj = new Fake<ISomeObejct>().FakedObject; 

     Assert.IsFalse(someList.Any()); 
     base.Do(); //<-- target 
     Assert.IsTrue(someList.Any()); 
    } 
    } 

지금은 내 테스트, 내 BIZZ 객체가 dosn't를 분리하는 기능이 다른 노출 방법을 제외하고는 가정했다.

나쁜 연습을 unittesting이 방법입니까? 단위 테스트 어댑터가 예외를 던졌다 : 그것은 심지어 실패한 저를 표시하기 전에 시작되지 않습니다

~Bizz(){Dispose(false);} 

public void Dispose() 
{ 
    Dispose(true); 
} 

private void Dispose(bool disposing) 
{ 
    if(!disposing) return; 
    //do cleanup resources 
} 

: 나는 더 이상 내 테스트를 실행할 수는 IDisposable을 구현하기 위해 내 Bizz 클래스를 수정

모호한 일치하는 항목을 찾았습니다.

Dispose 가상으로 만든 다음 테스트 클래스에서 재정의하려고 시도했지만 작동하지 않았습니다.

도움을 주시면 감사하겠습니다.

답변

1

예를 들어 http://msdn.microsoft.com/en-us/library/fs2xkftw(v=vs.100).aspx에 설명 된 표준 처리 패턴을 사용하면 문제가 해결됩니다. 즉, private void Dispose(bool disposing)...protected void Dispose(bool disposing)...으로 대체하십시오.

문제는 MSTest (Visual Studio 2010 및 2013 테스트 함)가 각 테스트 후에 테스트 클래스에서 dispose를 호출한다는 사실과 관련이 있습니다. 이를 위해 MSTest는 모든 public void Dispose 함수를 쿼리하지만 두 변수를 구별하는 함수 시그니처의 일부인 인수를 불행히도 무시합니다. 결과적으로 MSTest는 Ambiguous match found과 함께 존재합니다.

+0

설명해 주셔서 감사합니다. –

0

오류의 원인은 아직 미스터리입니다. 그러나 이것은 최대 fixet 듯 : 인터페이스가 이제 명시 적으로 Dispose(bool disposing)이 비공개되는 실제 정리 방법을 + implermented있다

void IDisposable.Dispose() 
{ 
    GC.SuppressFinalize(this); 
    Dispose(true); 
} 

private void Dispose(bool disposing) 
{ 
    //actual cleanup omitted 
} 

참고있다.