2014-04-30 11 views
2

단위 테스트 클래스에서 여러 개의 QueryString을 모의 (moq으로)하고 싶습니다. 아래는 코드의 조각이다 : - 아래여러 쿼리 문자열 모의 방법?

Adapter.MockQueryString("qs1", "1", _productController); 
Adapter.MockQueryString("qs2", "1", _productController); 

하고 어댑터 클래스 내 정적 기능 : -

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

문제는 마지막 쿼리 문자열을 조롱 (qs2)입니다 . 그리고 qs1.now에 null을주는 우리는 여러 개의 쿼리 문자열을 조롱 할 수 있습니까?

답변

0

MOQ는 당신이 모음을

편집를 허용하도록 설정을 조정해야 할 수도 모의

request.SetupSequence(r => r.QueryString) 
     .Returns(queryString1) 
     .Returns(queryString2); 

의 각 호출 후 다른 결과를 반환 할 수있는 SetupSequence있다

일반적으로를 사용하는 것이 더 나을 수도 있습니다.에는 상태 저장 메커니즘이 있습니다 (예 :

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

SturartLC @

MockQueryStringNameValueCollection 외부를 구축하고 한 번만 속성 반환 값을 설정할 수 있도록, 그에 전달합니다

public static void MockQueryStrings(NameValueCollection queryStrings, Controller controller) { // Set up a request var request = new Mock<System.Web.HttpRequestBase>(); request.Setup(r => r.QueryString).Returns(queryStrings); ... etc } 

을 다음 번 MockQueryStrings를 호출 전체 과정? – Pawan

+0

나는 요구 사항의 100 %가 아니지만, 위의 방법을 사용하면 Mock에서 SUT로 반환되는 N 값을 미리 설정할 수 있습니다. 'SetupSequence'는'QueryString'에 대한 몇가지 호출로 간단한 유닛 테스트에서 가장 잘 작동 할 것입니다. 그러나 당신이 설정을위한 프레임 워크를 추상화 한 것처럼 보이기 때문에, 순차적으로 각각의 값 콜렉션을 반환하는 일반적인 의미를 원할 수 있습니다. 후속 통화. 이전 설정 오류에 유의하십시오 -> QueryString은 속성이 아니라 메서드입니다. – StuartLC

0

문제는 다른 객체 (다른 NameValueCollection을 반환을 설정 한 후 객체 (qs1NameValueCollection)를 반환하는 속성을 설정하고있는 것입니다 : 폐쇄를 통해 반복자에 접근 qs2). 두 번째 SetUp은 첫 번째 문자를 대체하므로 항상 qs2 문자열이 표시됩니다. 당신이 제안 할 수 있습니다,

var queryStrings = new NameValueCollection(); 
queryStrings.Add("qs1", "1"); 
queryStrings.Add("qs2", "2"); 
Adapter.MockQueryStrings(queryStrings, _productController);