2013-04-08 83 views
2

我有以下控制器:嘲讽的Request.QueryString单元测试和主张反对意见

public class ResetController : Controller 
{ 
    // 
    // GET: /Reset/ 
    private Models.ResetModel rm = new Models.ResetModel(); 

    public ActionResult Index() 
    { 
     //Check that this has a query string that is containing in the database 
     //and has been done in the last 30 mins. 
     string qString = Request.QueryString["v"].ToString();    

     //if this is a good querystring 
     if (rm.CheckQString(qString)) 
      return View(); 
     else 
      return View("Index", "Home"); 
    } 

我现在需要创建一个单元测试,以确保如果值的Request.QueryString在数据库中找到,那么将返回适当的视图,但我无法这样做。这是我尝试在一个测试,以检查:

[TestMethod()] 
    public void IndexTest() 
    { 
     ResetController target = new ResetController();       
     var request = new Mock<HttpRequestBase>(); 
     request.SetupGet(r => r.QueryString).Returns(HttpUtility.ParseQueryString("?v=0ocIqhOQkrBaCXRO96E4B5HcOCYgMfJYOpRdNU/yIEUmH2szuXXKU51Td6NzRxlk")); 

     var result = target.Index() as ActionResult; 
     Assert.IsNotNull(result); 
    } 

是否有人可以帮助我的建议,以确保该控制器是完全测试?

感谢

回答

1

我建议你通过模型依赖于控制器。然后你可以在单元测试中模拟它,以将你的控制器逻辑从模型的CheckQString实现逻辑中分离出来。 我不确定如果我正确理解您的问题。

好的情况可能看起来像这样。当然,你需要检查是否返回了正确的视图。

[TestMethod()] 
public void IndexTest() 
{ 
    const string query = "some query"; 
    Models.ResetModel rm = new Mock<Models.ResetModel>(); 
    rm.Setup(m => m.CheckQString(query)).Returns(true); 
    ResetController target = new ResetController(rm.Object);       
    var request = new Mock<HttpRequestBase>(); 
    request.SetupGet(r => r.QueryString).Returns(HttpUtility.ParseQueryString("?v=" + query)); 

    var result = target.Index() as ActionResult; 
    Assert.IsNotNull(result); 
} 
4

这是一个迟到的答案,但在事件有人走来这篇文章在未来...参阅这篇how would I mock a querystring

的目标是使其不向测试隔离取决于数据库的QueryString结果,而是提供的值。要在Moq中执行此操作,请在创建模拟上下文后使用SetupGet方法。希望这可以帮助别人!