c# - 如何模拟多个查询字符串?

标签 c# unit-testing mocking moq request.querystring

我想在我的单元测试类中模拟(按最小起订量)多个 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/

相关文章:

python - Python 单元测试自动生成数据

Spring, JPA -- 具有许多其他实体传递依赖的实体的 CRUD 集成测试

PHPUnit 文件命名约定

c# - 由 ThreadPool 中的线程填充的 ObservableCollection

c# - 当我渲染局部 View 时,我的模型为空

c# - 只有在通过应用程序而不是通过 Management Studio 运行查询时才会出现隐式转换错误

java - 导入无法解决(Junit)

c# - 您如何使用只读属性模拟类?

ruby-on-rails - 如何在Carrierwave中从远程URL stub 下载

javascript - 在 highcharts 中显示 .Net Core Web API 响应