在ASP.NET Web 应用开发中,我们经常使用Moq来实现一些Mock对Controller,Action做单元测试。UnityAutoMoq是一个集成Unity and Moq的组件。您可以使用下面的Command-line在控制台安装它:

       Install-Package UnityAutoMoq

     假设有这样的Controller代码:

    public class AccountController : BaseController
    {
        //
        // GET: /Account/LogOn
        [HttpGet]
        public ActionResult LogOn()
        {
            var request = this.ControllerContext.HttpContext.Request;
            if (request != null && !request.IsLocal)
            {
                //Additional logic may perform here
                //....
                return View("LogOn");
            }
            return new EmptyResult();     
        }
    }
 

   先来看传统使用MOQ的代码是这样的:

        ///**Traditional approach**/
        [TestMethod]
        public void LogOn_ActionExecutes_ReturnsLogonView()
        {
            //Arrange   
            var context = new Mock<HttpContextBase>();
            var request = new Mock<HttpRequestBase>();

            request.Setup(r => r.IsLocal).Returns(() => false);
            context.Setup(c => c.Request).Returns(() => request.Object);

            var controllerContext = new ControllerContext { HttpContext = context.Object };
            var sut = new AccountController { ControllerContext = controllerContext };

            //Act
            var result = sut.LogOn() as ViewResult;

            //Assert
            Assert.AreEqual("LogOn", result.ViewName);
        }
 

看看下面的变化,第二个测试方法显式调用HttpContextBase
 

   1:          ///**UnityAutoMoq container - HttpContextBase**/
   2:          [TestMethod]
   3:          public void LogOn_ActionExecutes_ReturnsLogonView1()
   4:          {
   5:              //Arrange
   6:              var container = new UnityAutoMoqContainer();
   7:              var controllerContext = container.Resolve<ControllerContext>();
   8:              var sut = new AccountController { ControllerContext = controllerContext };
   9:   
  10:              //Act
  11:              var result = sut.LogOn() as ViewResult;
  12:   
  13:              //Assert
  14:              Assert.AreEqual("LogOn", result.ViewName);
  15:          }
  16:   
  17:          ///**UnityAutoMoq container - Explicit setup on HttpContextBase
  18:          [TestMethod]
  19:          public void LogOn_ActionExecutes_ReturnsLogonView2()
  20:          {
  21:              //Arrange            
  22:              var container = new UnityAutoMoqContainer();
  23:   
  24:              var context = container.GetMock<HttpContextBase>();
  25:              context.SetupGet(request => request.Request).Returns(() => null);
  26:   
  27:              var controllerContext = container.Resolve<ControllerContext>();
  28:              controllerContext.HttpContext = context.Object;
  29:   
  30:              var sut = new AccountController { ControllerContext = controllerContext };
  31:   
  32:              //Act
  33:              //we get null/empty Results
  34:              var result = sut.LogOn() as EmptyResult;
  35:   
  36:              //Assert
  37:              Assert.IsInstanceOfType(result,typeof(EmptyResult));
  38:          }

 

你有注意到这样的让代码更加简洁了,不用写太多了Setup方法。 这一个开源的组件, 你可参考实现自己的组件。

希望对您开发有帮助。

你可能感兴趣的文章:

Asp.net MVC 3 RTM 源代码中单元测试帮助类
Asp.net MVC中使用Razor Generator实现View的单元测试
使用Moles框架实现HttpWebRequest与HttpWebResponse的单元测试


作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog

posted on 2012-06-08 16:45  PetterLiu  阅读(1329)  评论(0编辑  收藏  举报