最近在自学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