2010-04-28 3 views
17

일부 MSTest 기반 단위 테스트를 설정하고 있습니다. 내 인생을 더 편리하게하기 위해 제네릭 설정과 테스트에 필요한 모든 테스트를 처리하는 기본 클래스를 사용하고 싶습니다. 내 기본 클래스는 다음과 같습니다MSTest에서 상속 사용

[TestClass] 
public class DBTestBase { 
    public TestContext TestContext { get; set; } 

    [ClassInitialize()] 
    public static void MyClassInitialize(TestContext testContext) { 
     var config = new XmlConfigurationSource("ARconfig_test.xml"); 
     ActiveRecordStarter.Initialize(Assembly.Load("LocalModels"), config); 
    } 

    [TestInitialize()] 
    public void MyTestInitialize() { 
     ActiveRecordStarter.CreateSchema(); 
     Before_each_test(); 
    } 

    protected virtual void Before_each_test() { } 

    [TestCleanup()] 
    public void MyTestCleanup() { 
     After_each_test(); 
    } 

    protected virtual void After_each_test() { } 
} 

내 실제 테스트 클래스는 다음과 같습니다 : 예상대로

[TestClass] 
public class question_tests : DBTestBase { 

    private void CreateInitialData() { 
     var question = new Question() 
          { 
           Name = "Test Question", 
           Description = "This is a simple test question" 
          }; 
     question.Create(); 
    } 

    protected override void Before_each_test() { 
     base.Before_each_test(); 
     CreateInitialData(); 
    } 

    [TestMethod] 
    public void test_fetching() { 
     var q = Question.FindAll(); 
     Assert.AreEqual("Test Question", q[0].Name, "Incorrect name."); 
    } 
} 

TestInitialize 기능이 작동합니다. 그러나 ClassInitialize 함수는 절대로 실행되지 않습니다.

[ClassInitialize()] 
    public static void t(TestContext testContext) { 
     MyClassInitialize(testContext); 
    } 

내 기본 클래스 내 자식 클래스를 참조하지 않고 실행할 수있는 기능을 초기화 얻을 수 있나요 : 내 아이 클래스에 다음 추가 할 경우 실행합니까?

+2

답변으로 추가하는 것이 너무 위험합니다. 기본 클래스에서 정적 생성자를 사용해보십시오. – roufamatic

+0

AssemblyInitialize()를 사용하여 종료되었습니다. 정확히 내가 원했던 것은 아니지만 MSTest가 그 일을하지 않는다고 생각합니다. @Roufamatic, 귀하의 답변은 아마도 유일한 방법입니다. 게시하는 경우이를 수락합니다. – oillio

답변

4

이것은 나에게도 문제가 있음을 확인했습니다. 베이스에 생성자를 사용하고 정리를 위해 소멸자를 사용했습니다.

+1

그 문제는 finalizer가 결정적 시간에 실행되는 것을 보장하지 않는다는 것입니다. 예를 들어 내 테스트에서 주어진 사용자를 가장하려고하지만 테스트가 완료되면 가장을 실행 취소합니다. 대부분의 다른 테스트는 실행되기 전에 실행되기 때문에 파이널 라이저에서는 작동하지 않습니다. –

+4

생성자의 문제는 TestInitialize와 동일하게 작동한다는 것입니다. 모든 테스트에서 실행됩니다. – bygrace

+0

여기에는 Finalizer가 없습니다. TestCleanup() - BIG 차이점 만 사용하십시오. TestCleanup()의 동작 및 실행은 결정적이고 잘 정의되어 있습니다. –

8

ClassInitialize 메서드는 관련 "클래스"에 적어도 하나의 TestMethod가 포함되어 있고 해당 클래스의 TestMethod 중 하나 이상이 실행되도록 선택되어있는 경우에만 실행됩니다.

+0

글쎄, 그 코드를 꽤 바보 같은 방법입니다. TestInitialize 및 TestCleanup 그런 식으로 작동하지 않습니다 ... – oillio

+0

동의 -하지만 방법은 그것이 내가 내 코드에 이것을 추가 :-( – Ambuj

+0

입니다 먹으 렴 : [ClassInitialize] 공공 새 정적 무효 ClassSetup (TestContext 컨텍스트) { TestBase을 .ClassSetup (context); } –

0
[TestClass] 
public class question_tests : DBTestBase { 
... 
    [TestCleanup()] 
    public void TestCleanup() 
    { 
     base.MyTestCleanup(); 
    } 
관련 문제