2012-01-15 20 views
8

我有一個Currency類,我堅持我的數據庫使用NHibernate。 Currency類看起來是這樣的:如何在NUnit 2.5中使用TestCase?

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

我已經寫了使用[TestCase]這樣的單元測試:

[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; 
    } 

我知道這是錯誤的,但我不知道怎麼寫。結果可以是object

回答

17

屬性參數(對於Result)必須是常量表達式。你不能像現在這樣創建對象。

使用TestCase屬性適用於需要驗證多個簡單輸入/輸出的測試案例。在你scenarion,但是,您可以做這樣的事情(也就是,如果你只打算驗證ID代碼映射是否正確):

[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 - 它們提供了相當不錯的例子。

編輯: 通過映射測試我的意思是驗證您的ORM映射(NHibernate的數據庫)是否正確,工作,你打算。你通常測試在以下情形:

  1. 創建與預定義的值(例如Currency
  2. 開始新的交易
  3. 保存實體(Save + Flush + Evict組合新的實體實例,以確保NHibernate的不存儲緩存器中保存的實體了)
  4. 檢索實體
  5. 比較檢索到的值與預定義的人
  6. 回滾事務

如果這樣的測試,然後通過,它或多或少地告訴你,我可以保存這個實體的值,然後我可以用完全相同的值取回它。這就是你想知道的 - 映射是正確的。

TestCase屬性tho,驗證整個對象的正確性是相當困難的 - 它的目的是測試簡單的東西。您可以使用類似於其他答案(通過參數TestCase傳遞參數)中建議的解決方法,但它很快變得難以理解且難以維護(想象具有6個以上屬性的實體需要驗證)。

我建議你測試分成一個驗證的id映射code是否正確(但是我看到這樣做毫無意義,除非你總是計劃必須映射到特定的代碼一定IDS)和另一個驗證是否Currency實體正確映射到數據庫表。

+0

謝謝,你能解釋我如何測試多個對象嗎?什麼是測繪測試? – 2012-01-15 13:03:54

+0

@Mark:通過映射測試,您可以驗證ORM映射是否正確(例如,如果使用'DateTime'屬性集保存實體,它將被映射並保存而不會丟失任何信息)。看我的編輯。 – 2012-01-15 13:20:04

3

在這種情況下,我將預期結果的構造函數參數傳遞給測試用例,然後檢查自己。雖然它不那麼簡潔,但它完成了工作。

[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))); 
} 
相關問題