2012-01-15 19 views
8

NHibernate kullanarak veritabanıma devam ettiğim bir Currency sınıfım var. Currency sınıf şuna benzer:NUnit 2.5'te TestCase nasıl kullanılır?

public class Currency : Entity 
{ 
    public virtual string Code { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Symbol { get; set; }   
} 

böyle [TestCase] kullanarak bir birim test yazdım:

[TestCase(6,Result = new Currency ({ Code="GBP", Name="British Pound", Symbol="£"}))] 
    public Currency CanGetCurrencyById(int id) 
    { 
     ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session); 
     Currency c = currencies.GetById<Currency>(id); 

     return c; 
    } 

Ben bunun yanlış olduğunu ama bunu yazmak nasıl emin değilim biliyorum. Sonuç object olabilir mi?

cevap

17

Öznitelik argümanı (Result için) sabit bir ifade olmalıdır. Artık senin gibi nesneleri yaratamazsın.

TestCase özniteliğini kullanmak, birden çok basit giriş/çıkış doğrulamak zorunda olduğunuz durumları test etmek için iyidir. - onlar oldukça iyi örnekler sunmak

Ayrıca
[TestCase(6, Result = "GBP")] 
[TestCase(7, Result = "USD")] 
[TestCase(8, Result = "CAD")] 
public string CanGetCurrencyById(int id) 
{ 
    ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session); 
    Currency c = currencies.GetById<Currency>(id); 

    return c.Code; 
} 

, TestCase documentation bir göz atın: sizin scenarion olarak, ancak böyle bir şey (sadece id-kod haritalama doğru olup olmadığını doğrulamak için planlıyorsanız yani,) yapabilirsiniz .

Düzenleme: haritalama testi derken amaçladığınız gibi ORM eşleştirmeleri (veritabanına NHibernate) doğru ve çalışma olup olmadığını doğrulamak anlamına geliyordu.

  1. NHibernate değil sağlamak için önceden tanımlanmış değerler (örn. Currency)
  2. Başlat yeni işlem
  3. kaydet varlık (Save + Flush + Evict kombinasyonu ile yeni taraf örneği oluşturma: Genellikle aşağıdaki senaryoda olduğunu test mağaza artık önbellekte varlık kaydedilir)
  4. Al varlık
  5. önceden tanımlanmış olanlarla alınan değerleri karşılaştırın
  6. Geri Alma işlemi

böyle bir test daha sonra geçerse, daha az ya da O değerlerle bu varlığı kaydedebilir ve ben o zaman tam olarak aynı değerlere ile alınan edebilirsiniz olduğunu söyler. Ve bilmek istediğin tek şey budur - haritalamalar doğrudur.

TestCase özniteliği ile, tüm nesnelerin doğruluğunu doğrulamak oldukça zordur - basit şeyleri test etmek içindir. Diğer yanıtlarda önerildiği gibi geçici çözümler (TestCase aracılığıyla bağımsız değişkenleri iletme) kullanabilirsiniz, ancak hızlı bir şekilde okunamaz ve bakımı zor hale gelir (doğrulamak için 6+ özellikli öğeyi düşünün). Ben code için id haritalanması doğru olup olmadığını doğrular birine testinizi bölme önermek

ve diğeri doğrulayarak (ancak ben hep planı belli kodlarına eşleştirilmiş belli kimlikleri var olmadıkça, bunu yaparken de küçük noktaya bakın) Currency öğesinin, veritabanı tablosuyla doğru şekilde eşlenmiş olup olmadığı.

+0

sayesinde, ben birden fazla nesne test edebilirsiniz nasıl açıklayabilir? Eşleme testi nedir? –

+0

@Mark: eşleme testi ile ORM eşlemelerinin doğru olduğunu doğrulayın (ör. 'DateTime' özelliği ayarlanmış bir öğe kaydederseniz, herhangi bir bilgi kaybı olmadan eşlenir ve kaydedilir). Düzenlememe bak. –

3

Böyle durumlarda test sonucuna beklenen sonuç için yapıcı argümanlarını iletiyorum ve kendimi kontrol et. Özlü olmamakla birlikte, işi bitirir.

[TestCase(6, "GBP", "British Pound", "£")] 
public void CanGetCurrencyById(int id, string code, string name, string symbol) 
{ 
    ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session); 
    Currency c = currencies.GetById<Currency>(id); 
    Assert.That(c, Is.EqualTo(new Currency(code, name, symbol))); 
} 
İlgili konular