2012-01-15 9 views
8

私はNHibernateを使用して私のデータベースに残るCurrencyクラスを持っています。 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属性を使用すると、複数の単純な入力/出力を検証する必要がある場合のテストに適しています。 - 彼らは非常に良い例を提供

また
[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を見てみましょう:あなたのscenarionでは、しかし、このようなものを(あなたが唯一のIDコードのマッピングが正しいかどうかを確認することを計画している場合それは、ある)行うことができます。

編集: マッピングテストすることによって、私はあなたのORMマッピング(データベースへのNHibernateのは)あなたが意図したとおりに正しいと作業しているかどうかを検証することを意味しました。

  1. 定義済みの値を持つ新しいエンティティインスタンスを作成します
  2. スタート新しいトランザクションを
  3. 保存エンティティ(Save + Flush + Evict組み合わせNHibernateのがないことを確認するために:あなたは、通常、次のシナリオでいることをテストする(例えばCurrency。)店舗もはやキャッシュに保存されたエンティティ)
  4. 取得エンティティ
  5. 事前に定義されたもので取得した値を比較
  6. ロールバックトランザクション

、このようなテストは、その後合格した場合、それは多かれ少なかれ、私はそれらの値でこのエンティティを保存することができ、そして私は、まったく同じ値でそれを取得したことができことを示しています。それはあなたが知りたかったことです - マッピングは正しいです。

TestCase属性では、オブジェクト全体の正確性を確認することは非常に困難です。単純なものをテストすることを意味します。他の回答(TestCase経由の引数を渡す)のような回避策を使用することはできますが、すぐに判読できず、保守が難しくなります(検証するプロパティが6以上のエンティティを想像してください)。私はcodeからidのマッピングが正しいかどうかを確認するものに、あなたのテストを分割示唆

は、もう一つの検証(ただし、私はあなたが常に計画、特定のコードにマッピングされた特定のIDを持っていない限り、それを行うには、ほとんどのポイントを参照してください) Currencyエンティティがデータベーステーブルに正しくマップされているかどうか。

+0

複数のオブジェクトをテストする方法を説明できますか?マッピングテストとは何ですか? –

+0

@マーク:マッピングテストでは、ORMマッピングが正しいことを確認します(たとえば、 'DateTime'プロパティが設定されているエンティティを保存すると、情報が失われることなくマップされ、保存されます)。私の編集を参照してください。 –

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))); 
} 
関連する問題