8

CurrencyNHibernate を使用してデータベースに永続化するクラスがあります。Currencyクラスは次のようになります。

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?

4

2 に答える 2

17

属性引数 ( for Result) は定数式でなければなりません。今のようにオブジェクトを作成することはできません。

属性の使用TestCaseは、複数の単純な入力/出力を検証する必要があるケースのテストに適しています。ただし、シナリオでは、次のようなことを行うことができます (つまり、id-code マッピングが正しいかどうかのみを確認する予定の場合)。

[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ドキュメンテーションを見てください- それらは非常に良い例を提供します。

編集:テストをマッピングすることで、ORMマッピング(NHibernateからデータベースへ)が正しく、意図したとおりに機能するかどうかを検証することを意味しました。通常、次のシナリオでそれをテストします。

  1. 事前定義された値で新しいエンティティ インスタンスを作成します (例: Currency)
  2. 新しい取引を開始
  3. エンティティを保存します ( NHibernate が保存されたエンティティをキャッシュに保存しないようにするためのSave+ Flush+の組み合わせ)Evict
  4. エンティティを取得する
  5. 取得した値を定義済みの値と比較する
  6. ロールバック トランザクション

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

属性 tho を使用TestCaseすると、オブジェクト全体の正確性を検証することは非常に困難です。単純なものをテストするためのものです。他の回答で提案されているような回避策を使用できますが (を介して引数を渡すTestCase)、すぐに読み取り不能になり、保守が困難になります (確認する 6 つ以上のプロパティを持つエンティティを想像してください)。

idtoのマッピングcodeが正しいかどうかを検証するテストに分割することをお勧めします(ただし、特定の ID を特定のコードにマップすることを常にCurrency計画していない限り、それを行う意味はほとんどありません)。エンティティがデータベーステーブルに適切にマップされているかどうかを検証するテスト。 .

于 2012-01-15T12:55:00.733 に答える
5

このような場合、期待される結果のコンストラクター引数をテスト ケースに渡し、自分でチェックします。それほど簡潔ではありませんが、仕事は完了します。

[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)));
}
于 2012-01-15T13:03:26.077 に答える