2009-08-12 2 views
0

장난감 예제 코드 :이 있다는 것 때문에 내 테스트가 실패 위의 예에서xUnit 이론을 개별적으로 실행할 때 테스트 클래스 생성자가 실행되지 않습니까?

public abstract class testBase 
{ 
    public testBase() 
    { 
    //Some common test setup code, which will initialize ManagerClass 
    } 
} 

public class someTests: testBase 
{ 
    public someTests() 
    { 
    //someTests-specific constructor code. 
    } 

    [Theory] 
    [PropertyData("MyTestData")] 
    public void test1(Foo foo) 
    { 
    //Use foo to do a test 
    } 

    public static IEnumerable<object[]> MyTestData 
    { 
    get 
    { 
     yield return new object[] { ManagerClass.CreateANewFoo(1) }; 
     yield return new object[] { ManagerClass.CreateANewFoo(42) }; 
    } 
    } 
} 

내가 특별히 TEST1를 실행하면, (나는 ReSharper에서 사용하고 있습니다,하지만 난 xUnit의 GUI를 사용할 때 문제가 발생합니다) testBase 및 someTests 생성자가 실행되고 있지 않습니다. 따라서 ManagerClass.CreateANewFoo()를 호출하면 NullReference가 발생합니다.

someTests 또는 다른 개별 테스트에서 모든 테스트를 실행하면 생성자가 예상대로 실행되고 테스트가 예상대로 진행됩니다. test1을 다른 것으로 표시하는 유일한 것은 PropertyData 특성을 사용한다는 사실입니다.

왜 이런 일이 벌어지고 있는지/내가 뭘 잘못하고있는가?

+0

면책 조항 : xUnit.net을 사용하지 마십시오. Console.WriteLine/trace 문을 ctors에 넣으려고 했습니까? 테스트 고정구/클래스의 인스턴스를 만들지 않고 테스트를 실행할 수있는 방법을 알지 못하기 때문에 ctor가 호출되지 않습니다. Run All Tests/Run One Test 결과가 다른 테스트 결과로 나타나면 버그와 같은 소리가납니다. 시도 : ctors가 치는 경우, 정적 메서드의 반환 대신 가짜 값을 사용해보십시오? 테스트는 xUnit.net의 다른 AppDomains에서 실행됩니까 – Gishu

+0

Console.WriteLine 문을 넣으면 테스트가 전체 클래스의 일부로 실행될 때 실행되는 생성자가 표시됩니다. 그러나 개별적으로 (Writeline 문에서 중단 점을 사용하여) 디버거에서 가장 먼저 발생하는 것은 중단 점이 아닌 NullReference입니다. – BenA

+0

정적 메서드를 호출하기 위해 개체를 구성하지 않아도되기 때문에 테스트가 실행되기 전에 정적 MyTestData 메서드가 호출되기 때문일 수 있습니다. 이 테스트 픽스쳐 (fixture) 디자인은 나를 조금 불편하게 만듭니다. 정적 메소드는 올바르게 실행하기 위해 기본 클래스 ctor에 의존합니다. PropertyData 메서드가 인스턴스 메서드가 될 수 있습니까? 설치 코드를 기본 클래스 ctor에서 정적 메서드로 임시로 이동하여 해당 원인인지 확인하십시오. – Gishu

답변

1

xUnit.net 1.5 Beta로 재생산하려했으나 시도 할 수 없습니다.

+0

CodePlex (http://xunit.codeplex.com/Thread/View.aspx?ThreadId=65564)에 대한 자세한 설명을 마친 후 실행 순서에 따라 테스트를 리팩터링해야합니다. – BenA