C# ASP.net MVC 4单元测试Viewbag/ViewModel测试

C# ASP.net MVC 4单元测试Viewbag/ViewModel测试,c#,asp.net-mvc,testing,C#,Asp.net Mvc,Testing,我不熟悉.net中的单元测试/mvc。我一直在关注Pro ASP.net MVC 4第四版这本书。在书中,他们创建了一个假商店。在其中一个示例中,它们使用viewbag将数据传递到局部视图。他们有一个关联的单元测试可以工作,但是我重写了这个示例,通过视图模型而不是viewbag容器传递数据,现在我似乎无法找到一种方法来重写单元测试以通过。有人介意帮我吗?我只是花了一个小时试图弄明白这一点,但这是徒劳的。以下是工作测试 // Arrange // - create the mock reposit

我不熟悉.net中的单元测试/mvc。我一直在关注Pro ASP.net MVC 4第四版这本书。在书中,他们创建了一个假商店。在其中一个示例中,它们使用viewbag将数据传递到局部视图。他们有一个关联的单元测试可以工作,但是我重写了这个示例,通过视图模型而不是viewbag容器传递数据,现在我似乎无法找到一种方法来重写单元测试以通过。有人介意帮我吗?我只是花了一个小时试图弄明白这一点,但这是徒劳的。以下是工作测试

// Arrange
// - create the mock repository
Mock<IProductRepository> mock = new Mock<IProductRepository>();
mock.Setup(m => m.Products).Returns(new Product[] {
    new Product {ProductID = 1, Name = "P1", Category = "Apples"},
    new Product {ProductID = 4, Name = "P2", Category = "Oranges"},
}.AsQueryable());

// Arrange - create the controller
NavController target = new NavController(mock.Object);

// Arrange - define the category to selected
string categoryToSelect = "Apples";

// Action
string result = target.Menu(categoryToSelect).ViewBag.SelectedCategory;

// Assert
Assert.AreEqual(categoryToSelect,result);
//排列
//-创建模拟存储库
Mock Mock=新Mock();
mock.Setup(m=>m.Products).Returns(新产品[]{
新产品{ProductID=1,Name=“P1”,Category=“Apples”},
新产品{ProductID=4,Name=“P2”,Category=“Oranges”},
}.AsQueryable());
//排列-创建控制器
NavController目标=新的NavController(mock.Object);
//排列-定义要选择的类别
字符串categoryToSelect=“苹果”;
//行动
字符串结果=target.Menu(categoryToSelect).ViewBag.SelectedCategory;
//断言
Assert.AreEqual(类别选择、结果);
现在我已经(成功地)通过视图模型传递了数据

public class CategoryInfoViewModel:IEnumerable<string>
{
    public IEnumerable<string> Categories { get; set; }
    public string SelectedCategory { get; set; }

    public IEnumerator<string> GetEnumerator()
    {
        return Categories.GetEnumerator();
    } 

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    } 
}
public类CategoryInfoViewModel:IEnumerable
{
公共IEnumerable类别{get;set;}
公共字符串SelectedCategory{get;set;}
公共IEnumerator GetEnumerator()
{
返回类别。GetEnumerator();
} 
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
} 
}

如何更改测试以使其正常工作?谢谢各位

假设操作的返回类型是ViewResult,可以使用以下代码:

// Arrange
// - create the mock repository
Mock<IProductRepository> mock = new Mock<IProductRepository>();
mock.Setup(m => m.Products).Returns(new Product[] {
    new Product {ProductID = 1, Name = "P1", Category = "Apples"},
    new Product {ProductID = 4, Name = "P2", Category = "Oranges"},
}.AsQueryable());

// Arrange - create the controller
NavController target = new NavController(mock.Object);

// Arrange - define the category to selected
string categoryToSelect = "Apples";

// Action
string result = (ViewResult)target.Menu(categoryToSelect);

// Assert
Assert.AreEqual(categoryToSelect,result.Model);
//排列
//-创建模拟存储库
Mock Mock=新Mock();
mock.Setup(m=>m.Products).Returns(新产品[]{
新产品{ProductID=1,Name=“P1”,Category=“Apples”},
新产品{ProductID=4,Name=“P2”,Category=“Oranges”},
}.AsQueryable());
//排列-创建控制器
NavController目标=新的NavController(mock.Object);
//排列-定义要选择的类别
字符串categoryToSelect=“苹果”;
//行动
字符串结果=(ViewResult)target.Menu(categoryToSelect);
//断言
Assert.AreEqual(categoryToSelect,result.Model);
我希望这对你有用。
你好,

好的,我终于明白了。我是个笨蛋。我创建的视图模型类称为CategoryInfoViewModel。所以我不得不这么做

 // Action
 CategoryInfoViewModel result = (CategoryInfoViewModel)target.Menu(categoryToSelect).Model;

 // Assert
 Assert.AreEqual(categoryToSelect, result.SelectedCategory);

您的测试应该测试什么行为?我试图断言SelectedCategory是正确的//操作字符串result=target.Menu(categoryToSelect).ViewBag.SelectedCategory;老实说。。。我不太喜欢这种测试。这里没有使用业务逻辑;测试仅仅是断言已经选择了一个类别。你基本上是在测试这个框架,最好已经开始工作了。测试只是一个仪式,没有太多的好处。完全按照你的想法,Robert,但是这更多是为了让我了解如何在单元测试中访问模型属性。挫败了meStill的垃圾,没有骰子,但谢谢你的投入。如果有帮助的话,菜单是一个partialviewresult。铸造ViewResult!=不过也可以。伙计,这让我很沮丧,所以请将类型转换为PartialViewResult string result=(PartialViewResult)target.Menu(categoryToSelect);奥古斯都看到了我上面的答案。谢谢你的回复,给了我深刻的见解。非常感谢