Silver Lightning Ответов: 2

Метод рекурсии MOQ в C#


Привет всем,

У меня есть вопрос о том, как я могу вызвать метод внутри того же метода внутри моего mockrespository.setup на MOQ. Ниже приведен мой фактический код, в котором мне нужно вызвать свой метод ChangeFilterAttribute внутри того же метода ChangeFilterAttribute.

Или любой может дать мне пример сценария, который вызывает метод внутри того же имени метода в модульном тестировании moq.

Заранее благодарю вас за вашу любезную помощь.

Что я уже пробовал:

private void GetFilters_Initialize()
       {
           _mockRepository.Setup(p => p.ChangeFilterAttribute(It.IsAny<IList<IFilterDescriptor>>(), It.IsAny<Dictionary<string, Dictionary<string, Dictionary<string, int>>>>()))
                           .Returns((IList<IFilterDescriptor> filters, Dictionary<string, Dictionary<string, Dictionary<string, int>>> dictionaryColumnValue) =>
           {

               if (filters.Any())
               {
                   foreach (var filter in filters)
                   {
                       var descriptor = filter as FilterDescriptor;
                       foreach (var item in dictionaryColumnValue)
                       {
                           if (descriptor != null && item.Key == descriptor.Member)
                           {
                               foreach (var memVal in item.Value)
                               {
                                   descriptor.Member = memVal.Key.ToString();
                                   foreach (var conVal in memVal.Value)
                                   {
                                       if (descriptor.ConvertedValue.Equals(conVal.Key))
                                       {
                                           descriptor.Value = conVal.Value;
                                           descriptor.Operator = FilterOperator.IsEqualTo;
                                           break;
                                       }
                                       else
                                           descriptor.Operator = FilterOperator.Contains;
                                   }
                               }
                           }
                           else if (filter is CompositeFilterDescriptor)
                           {
                               var compositeFilterDescriptor = filter as CompositeFilterDescriptor;
                               if (compositeFilterDescriptor != null)
                               {
                                 // This is my problem, on how could I call this inside of this changefilterAtribute method in my unit testing
                                 ChangeFilterAttribute(compositeFilterDescriptor.FilterDescriptors, _changeFilterAttribute_DictonaryColumnValues);

                               }
                           }
                       }
                   }
               }
               return filters;


           });
       }

Silver Lightning

Может ли кто-нибудь подсказать мне, как я могу использовать обратный вызов в рекурсии unit test MOQ в C#? Заранее спасибо

2 Ответов

Рейтинг:
7

Silver Lightning

Решено!

private void GetFilters_Initialize()
      {
          var myFilters = new Object();
          _mockRepository.Setup(p => p.ChangeFilterAttribute(It.IsAny<IList<IFilterDescriptor>>(), It.IsAny<Dictionary<string, Dictionary<string, Dictionary<string, int>>>>()))

          .Callback((IList<IFilterDescriptor> filters, Dictionary<string, Dictionary<string, Dictionary<string, int>>> dictionaryColumnValue) =>
              {
                  foreach (var filter in filters)
                      if (filter is CompositeFilterDescriptor)
                      {
                          var compositeFilterDescriptor = filter as CompositeFilterDescriptor;
                          if (compositeFilterDescriptor != null)
                          {
                              myFilters = compositeFilterDescriptor.FilterDescriptors;
                              return ;

                          }
                      }
                      else
                      {
                          myFilters = filters;
                          return;
                      }

              })
               .Returns((IList<IFilterDescriptor> filters, Dictionary<string, Dictionary<string, Dictionary<string, int>>> dictionaryColumnValue) =>
                          {

                              filters = myFilters as IList<IFilterDescriptor>;
                              if (filters.Any())
                              {
                                  foreach (var filter in filters)
                                  {
                                      var descriptor = filter as FilterDescriptor;
                                      foreach (var item in dictionaryColumnValue)
                                      {
                                          if (descriptor != null && item.Key == descriptor.Member)
                                          {
                                              foreach (var memberValue in item.Value)
                                              {
                                                  descriptor.Member = memberValue.Key.ToString();
                                                  foreach (var convertedValue in memberValue.Value)
                                                  {
                                                      if (descriptor.ConvertedValue.Equals(convertedValue.Key))
                                                      {
                                                          descriptor.Value = convertedValue.Value;
                                                          break;
                                                      }
                                                  }
                                              }
                                          }
                                      }
                                  }
                              }
                              return filters;

                          });

      }


Рейтинг:
1

#realJSOP

Я бы подумал, что вам придется написать рекурсивный метод, который обертывает вызов ChangeFilterAttribute.


Silver Lightning

Вы имеете в виду, что мне нужно написать новый метод внутри атрибута ChangeFilterAttribute? можете ли вы дать мне образец псевдокода или что-то в этом роде? Большое спасибо

Silver Lightning

Кто-нибудь может помочь мне в том, как я могу реализовать обратный вызов в MOQ в рекурсивном методе. (Вызов того же метода внутри этого метода)? Заранее спасибо.