模拟用于单元测试的Request.QueryString并对视图断言

时间:2013-04-08 14:20:11

标签: asp.net-mvc-3 unit-testing controller mocking moq

我有以下控制器:

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);
    }  

有人可以帮我提供建议,以确保该控制器经过全面测试吗?

由于

2 个答案:

答案 0 :(得分:4)

这是一个迟到的答案,但如果将来有人来这篇文章...请参阅这篇文章how would I mock a querystring

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

答案 1 :(得分: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);
}