ViewModel を引数として取るヘルパー メソッドをテストしたいと考えています。私が抱えている問題は、テストでは、ViewModel が使用するすべてのモデルをインスタンス化して割り当てる必要があるように見えることです。以下に示す例では、数が少ないためそれほど大したことではありませんが、実際に取り組んでいる VM には大量の VM があります。すべてのオブジェクトを作成して割り当てる必要がないように、これを行う他の方法はありますか?
説明用のコード例...
モデル
public class Meal
{
public int MealID { get; set; }
public string Title { get; set; }
public decimal Cost { get; set; }
}
public class Beverage
{
public int BeverageID { get; set; }
public string Title { get; set; }
public decimal Cost { get; set; }
}
public class Desert
{
public int DesertID { get; set; }
public string Title { get; set; }
public decimal Cost { get; set; }
}
ビューモデル
public class DinnerViewModel
{
public Meal Meal { get; set; }
public Beverage Beverage { get; set; }
public Desert Desert { get; set; }
public decimal SalesTax { get; set; }
public bool SeniorDiscount { get; set; }
}
ヘルパー
public class Calculator
{
public decimal Total(DinnerViewModel dvm)
{
decimal subtotal = dvm.Meal.Cost + dvm.Beverage.Cost + dvm.Desert.Cost;
if (dvm.SeniorDiscount)
{
subtotal = subtotal - (subtotal * 0.1M);
}
return subtotal + (subtotal * dvm.SalesTax);
}
}
テスト
[TestMethod]
public void CalculatorReturnsCorrectTotalForNonSenior()
{
DinnerViewModel dvm = new DinnerViewModel();
dvm.Meal.Cost = 7M;
dvm.Beverage.Cost = 1M;
dvm.Desert.Cost = 2M;
dvm.SalesTax = 0.08M;
dvm.SeniorDiscount = false;
Calculator calc = new Calculator();
decimal expected = 10.80M;
decimal actual = calc.Total(dvm);
Assert.AreEqual(expected, actual, "The actual value does not match the expected value.");
}
これにより、「NullReferenceException」エラーが発生します。先ほど言ったように、必要なオブジェクトを作成して割り当てることができます...
[...]
Meal meal = new Meal();
dvm.Meal = meal;
dvm.Meal.Cost = 7M;
[...]
...そして、すべてが完了すると、テストは成功しますが、大規模な VM ではかなりの作業のように思えます。これを簡単にするために何かできることがあると感じています。