我想測試一個將ViewModel作爲參數的幫助器方法。我遇到的問題是,測試似乎需要我實例化並分配我的ViewModel使用的所有模型。在我給出的例子中,這不是什麼大不了的,因爲只有少數幾個,但是在我工作的實際虛擬機上有一噸。有沒有其他的方式來做到這一點,所以我不必創建和分配每個對象?出於說明的目的如何對ViewModel使用方法進行單元測試?
實施例的代碼...
模型
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;
[...]
...而且,一旦他們完成所有操作,測試成功,但是這似乎是一個更大的虛擬機大量的工作我覺得有一些事情我可以做,讓這更容易。
這個問題解決了!謝謝一堆! – Jason
我確定了另一件我在做錯的事情,這在我的示例代碼中並不明顯。當一個模型有一個像'public int AnotherModelID {get;組; }'和一個像'public virtual AnotherModel AnotherModel {get;組; }',例如,在View中可以訪問像'vm.Model.AnotherModel.Property'這樣的屬性,但是在測試時它似乎不起作用。除了在構造函數中實例化模型之外,我還必須將模型添加到VM中,如'AnotherModel AnotherModel = new AnotherModel();' – Jason