我想在我的单元测试类中模拟(按最小起订量)多个 QueryString。 下面是一段代码:-
Adapter.MockQueryString("qs1", "1", _productController);
Adapter.MockQueryString("qs2", "1", _productController);
下面是我的 Adapter 类的静态函数:-
public static void MockQueryString(string querystringKey, string querystringValue, Controller controller)
{
var queryString1 = new NameValueCollection();
queryString1.Add(querystringKey, querystringValue);
// Set up a request
var request = new Mock<System.Web.HttpRequestBase>();
request.Setup(r => r.QueryString).Returns(queryString1);
// Inject into the controller
var controllerBase = new Mock<ControllerBase>();
var contextBase = new Mock<System.Web.HttpContextBase>();
contextBase.Setup(c => c.Request).Returns(request.Object);
request.Setup(r => r.QueryString).Returns(queryString1);
var controllerContext = new ControllerContext(contextBase.Object, new System.Web.Routing.RouteData(), controllerBase.Object);
controller.ControllerContext = controllerContext;
}
Problem is its only mocking the last query string (qs2).And giving null for qs1.How we can mock multiple query strings ?
最佳答案
起订量有SetupSequence
,它允许您在每次调用 Mock 后返回不同的结果
request.SetupSequence(r => r.QueryString)
.Returns(queryString1)
.Returns(queryString2);
您可能需要调整设置才能接受集合
编辑
在一般情况下,您最好使用具有状态机制的 Setup
,例如通过闭包访问迭代器:
public static void MockQueryString(IEnumerable<Tuple<string, string>> qstringTuples,
Controller controller)
{
// Convert collection to IEnum<NameValueCollection>
var queryStrings = qstringTuples
.Select(_ => new NameValueCollection {{_.Item1, _.Item2}})
.ToList();
// Set up a request
var request = new Mock<System.Web.HttpRequestBase>();
var queryStringIterator = queryStrings.GetEnumerator();
request.SetupGet(r => r.QueryString)
.Returns(() =>
{
queryStringIterator.MoveNext();
return queryStringIterator.Current;
});
关于c# - 如何模拟多个查询字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23380233/