Asp.net mvc 单元测试中调用控制器方法返回数据的Model属性

最近在自学asp.net mvc 参考的书籍是Adam Freeman的Pro Asp.Net Mvc5
其中在一个演示项目的单元测试中遇到了问题。代码如下:

using System;
using System.Linq;
using System.Collections;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System.Web.Mvc;
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Entities;
using SportsStore.WebUI.Controllers;
using System.Collections.Generic;

namespace SportsStore.UnitTests
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void Can_Pagenate()
        {
            //准备
            Mock<IProductRepository> mock = new Mock<IProductRepository>();
            mock.Setup(m=>m.Products).Returns(new Product[]{
            new Product{ProductID = 1,Name="P1"},
            new Product{ProductID = 2,Name="P2"},
            new Product{ProductID = 3,Name="P3"},
            new Product{ProductID = 4,Name="P4"},
            new Product{ProductID = 5,Name="P5"},
            });
            ProductController controller = new ProductController(mock.Object);
            controller.PageSize = 3;

            //动作
            IEnumerable<Product> result = (IEnumerable<Product>)controller.List(2).Model;

            //断言
            Product[] prodArray = result.ToArray();
            Assert.IsTrue(prodArray.Length == 2);
            Assert.AreEqual(prodArray[0].Name, "P4");
            Assert.AreEqual(prodArray[1].Name,"P5");

        }
    }
}

在以下代码初出现错误:
IEnumerable result = (IEnumerable)controller.List(2).Model;
提示:“System.Web.Mvc.ActionResult”不包含Model的定义,并且找不到可接受类型为"System.Web.Mvc.ActionResult"的第一个参数的扩展方法"Model"(是否缺少using指令或程序集引用?)
疑惑如下:
该单元测试的这里的思想是,将控制器方法返回的数据进行获取,在结果上调用Model属性。这里调用失败了。但是为什么失败呢
这里还有另一个错误 提示:程序集“SportsStore.WebUI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”所使用的“System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”版本高于所引用的程序集“System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的版本
是否与此相关,又该如何解决呢
另外还有几个错误如下:
错误 3 类型“System.Web.IHttpModule”在未被引用的程序集中定义。必须添加对程序集“System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用。 G:\项目\SportsStore\SportsStore.UnitTests\App_Start\NinjectWebCommon.cs 23 13

错误 5 未能找到类型或命名空间名称“IHttpModule”(是否缺少 using 指令或程序集引用?) G:\项目\SportsStore\SportsStore.UnitTests\App_Start\NinjectWebCommon.cs 44 25

NinjectWebCommon.cs

 [assembly: WebActivator.PreApplicationStartMethod(typeof(SportsStore.UnitTests.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(SportsStore.UnitTests.App_Start.NinjectWebCommon), "Stop")]

namespace SportsStore.UnitTests.App_Start
{
    using System;
    using System.Web;

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;

    public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(kernel);
            return kernel;
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
        }        
    }
}

这里使用的软件是Visual Studio 2013

2个回答

卡在这里一个下午了,想狗带

解决了 之所以不能调用控制器方法返回的数据。是因为其返回的类型为ActionResult 而非ViewResult。。。
版本错误的原因是因为 单元测试项目的包引用的Microsoft.Aspnet.mvc 的程序集是用NuGet获取的为5.0.0版本 而本人使用的Vs2013
在SportsStore.WebUI中自带的版本为5.2.2 ,使用NuGet将SportsStore.UnitTests测试项目中的程序集更新为5.2.2.0 版本
Bug 解决。

everglow125
everglow125 哈哈哈,我是照着敲代码,没注意返回类型是ActionResult,而书本上已经改成了ViewResult,小坑
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐