2010-05-06 23 views
6

Bir StartInfo örneği oluşturmak için farklı bir statik işlev kullanmaları dışında, bu üç sınama birbirinin aynısıdır. Test desenimin tamamını oluşturan bu model var ve bunu [TestCase] ​​kullanarak ya da klişe kodunu azaltan başka bir yolla basitleştirebilmek için 'u seveceğim. Bilgimin en iyisine, bir [TestCase] ​​argümanı olarak bir delege kullanma iznim yok ve buradaki insanların daha aşağıdan aşağıya nasıl kod oluşturacağına dair yaratıcı fikirleri olduğunu umuyorum.Bu NUNit testlerini nasıl basitleştiririm?

[Test] 
    public void ResponseHeadersWorkinPlatform1() 
    { 
     DoResponseHeadersWorkTest(Platform1StartInfo.CreateOneRunning); 
    } 
    [Test] 
    public void ResponseHeadersWorkinPlatform2() 
    { 
     DoResponseHeadersWorkTest(Platform2StartInfo.CreateOneRunning); 
    } 
    [Test] 
    public void ResponseHeadersWorkinPlatform3() 
    { 
     DoResponseHeadersWorkTest(Platform3StartInfo.CreateOneRunning); 
    } 

    void DoResponseHeadersWorkTest(Func<ScriptResource,StartInfo> startInfoCreator) 
    { 
     ScriptResource sr = ScriptResource.Default; 
     var process = startInfoCreator(sr).Start(); 
     //assert some things here 
    } 

cevap

8

İlk olarak, orijinalin çok kötü olduğunu düşünmüyorum. İddiaların, test vakasından test vakasına farklıysa, sadece dağınık.

Her neyse, siz bir test durumu kullanabilir, ancak daha karmaşık türlerin kullanılması nedeniyle standart bir [TestCase] ​​özniteliği yoluyla yapılamaz. Bunun yerine, veri sağlayıcı olarak bir genel IEnumerable <> kullanmanız ve daha sonra [TestCaseSource] özniteliği ile test yönteminizi etiketlemeniz gerekir.

deneyin gibi bir şey:

public IEnumerable<Func<ScriptResource, StartInfo>> TestCases 
    { 
     get 
     { 
      yield return Platform1StartInfo.CreateOneRunning; 
      yield return Platform2StartInfo.CreateOneRunning; 
      yield return Platform3StartInfo.CreateOneRunning; 
     } 
    } 

    [TestCaseSource("TestCases")] 
    public void MyDataDrivenTest(Func<ScriptResource, StartInfo> startInfoCreator) 
    { 
     ScriptResource sr = ScriptResource.Default; 
     var process = startInfoCreator(sr); 

     // do asserts 
    } 
} 

Bu parametreleri içeren TestCaseData örneklerini veren standart modelin daha özlü bir versiyonudur. TestCaseData örneklerini verirseniz, her bir teste daha fazla bilgi ve davranış ekleyebilir (beklenen istisnalar, açıklamalar vb. Gibi), ancak biraz daha ayrıntılıdır.

Bu şeyi gerçekten beğenmemin bir kısmı, 'hareket' için bir yöntem ve 'savundunuz' için bir yöntem yapabilmeniz, daha sonra bunları birbiriyle karıştırıp eşleştirebilmenizdir. Örneğin. arkadaşım dün bir şeyler yaptığını söyleyerek iki eylemi kullandı ("Blah yöntemi denildiğinde, bu yöntem ViewModel'de tetiklenmelidir"). Çok ters ve etkili!

+1

bana yeni bir konsept öğretti! artı +1 – Prashant

+0

+1 hoş. İşte geliştirilmiş [NUnit doc örnekleri ile bağlantı] (http://nunit.org/index.php?p=testCaseSource&r=2.5.10). –

0

Güzel görünüyor. Belki bir fabrika eklemek ister misiniz? Veya bu yöntemleri bir Eylem Listesi'ne (test ayarlarında) ekleyebilir ve ilk eylem temsilcisi, ikinci eylem temsilcisi ve üçüncü eylem temsilcisi olarak arayabilirsiniz.