MSTest

2010-04-28 13 views
17

'da miras mirasını kullanma Bazı MSTest tabanlı birim testleri ayarlıyorum. Hayatımı kolaylaştırmak için genel kurulumları gerçekleştiren ve testlerimin tümünü tarayan bir temel sınıf kullanmak istiyorum. Benim taban sınıfı şöyle görünür: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() { } 
} 

Benim gerçek test sınıfı şuna benzer: beklendiği gibi

[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 fonksiyonu çalışır. Ancak ClassInitialize işlevi hiçbir zaman çalışmaz.

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

benim taban sınıfı Çocuğum sınıfta onu referans olmadan çalıştırmak için fonksiyonunu başlatmak almak mümkün mü: Çocuğumun sınıfa aşağıdaki eklerseniz çalışıyor mu?

+2

Yanıt olarak eklemek çok zor: temel sınıfta statik bir kurucu kullanmayı deneyin. – roufamatic

+0

AssemblyInitialize() kullanarak bitti. Tam olarak istediğim gibi değil, ama sanırım MSTest bunu yapmıyor. @Roufamatic, cevabınız sadece tek yoldur. Eğer gönderirseniz, kabul edeceğim. – oillio

cevap

4

Bunun benim için de bir sorun olduğunu onaylayın. Taban üzerinde bir kurucu ve temizleme için bir yıkıcı kullandım

+1

Sorun şu ki, kesinleştiricinin deterministik bir zamanda çalışması garanti edilmez. Örneğin, testlerimde belirli bir kullanıcının kimliğine bürünmek istiyorum, ancak bir kez testlerimi gerçekleştirdikten sonra kimliğe bürünme işlemini bitirdim. Bu bir finalizer ile çalışmaz, çünkü büyük olasılıkla benim diğer testlerim kaçmadan önce çalışır. –

+4

Kurucudaki sorun, TestInitialize ile aynı şekilde çalışmasıdır. Her testte çalışacak. – bygrace

+0

Burada bir Sonlandırıcı yok - sadece TestCleanup() - BIG farkının kullanımı. TestCleanup() 'ın davranışı ve yürütülmesi deterministik ve iyi tanımlanmıştır. –

8

ClassInitialize yöntemi, yalnızca ilgili "sınıf" en az bir TestMethod içeriyorsa ve yürütme için sınıftan en az bir TestMethod seçildiyse yürütülür.

+0

Eh, bu kodlamak için oldukça aptal bir yoldur. TestInitialize ve TestCleanup bu şekilde çalışmaz ... – oillio

+0

kabul etti - ama yolu benim koduna bu katma :-( – Ambuj

+0

thats: [ClassInitialize] kamu yeni static void ClassSetup (TestContext bağlamı) { TestBase .ClassSetup (bağlam); } –

0
[TestClass] 
public class question_tests : DBTestBase { 
... 
    [TestCleanup()] 
    public void TestCleanup() 
    { 
     base.MyTestCleanup(); 
    } 
İlgili konular