我有以下控制器:
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);
}
有人可以帮我提供建议,以确保该控制器经过全面测试吗?
由于
答案 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);
}