我想测试一个将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