2015-04-17 4 views
1

Я хочу протестировать репозиторий на фоне какого-то прочного поведения сети. Я подделал класс, используя MS Фальшивки и это выглядит следующим образом:Вызов исходного метода в классе прокладок

ShimInputRepository 
       .AllInstances 
       .UpdateEngagementStringNullableOfInt64NullableOfInt32String = (xInst, xEngId, xTrimUri, xTargetVers, xComments) => 
        { 


         if (xEngId != initializer.SeededEngagementsWithoutEmp[3].EngagementId) 
         { 
          return xInst.UpdateEngagement(xEngId, xTrimUri, xTargetVers, xComments); //Unfortunately, calls recursively same method (not the original one) 
         } 
         else 
         { 
          throw new Exception 
            (
             "An error occurred while executing the command definition. See the inner exception for details.", 
             new Exception 
             (
              "A transport-level error has occurred when receiving results from the server. (provider: Session Provider, error: 19 - Physical connection is not usable)" 
             ) 
            ); 

         } 
        }; 

Я не знаю, как назвать оригинальный метод из жгутов, что код (в настоящее время она рекурсивно вызывает тот же метод).

Как назвать оригинальный метод?

UPDATE: То, что я действительно хочу достичь, - это выбросить исключение по конкретному вызову этого метода (инструкция if() ... »и переслать вызов в исходный экземпляр в противном случае.

+0

Какой метод вы хотите назвать? – mbdavis

+0

Единственное, что я реализовал, то есть «UpdateEngagement ...» – user3284063

+0

Вы хотите называть его изначально из того же метода? это невозможно, код для вызова никогда не будет достигнут. Или вы хотите знать, как назвать это за пределами этого метода. – mbdavis

ответ

5

Основа Fakes обеспечивает поддержку только для такого случая. Вы можете использовать:

ShimInputRepository 
      .AllInstances 
      .UpdateEngagementStringNullableOfInt64NullableOfInt32String = (xInst, xEngId, xTrimUri, xTargetVers, xComments) => 
       { 


        if (xEngId != initializer.SeededEngagementsWithoutEmp[3].EngagementId) 
        { 
         return ShimsContext.ExecuteWithoutShims(() => xInst.UpdateEngagement(xEngId, xTrimUri, xTargetVers, xComments)); 
        } 
        else 
        { 
         throw new Exception 
           (
            "An error occurred while executing the command definition. See the inner exception for details.", 
            new Exception 
            (
             "A transport-level error has occurred when receiving results from the server. (provider: Session Provider, error: 19 - Physical connection is not usable)" 
            ) 
           ); 

        } 
       }; 

Метод ShimsContext.ExecuteWithoutShims выполнит Func < T> вне текущего контекста прокладки (например, без перенаправления шайбы, которые причиняли вам ваш бесконечный цикл).

Причина вашего бесконечного цикла заключается в том, что создание ShimContext изменяет вашу сборку во время выполнения. Пока контекст активен, все вызовы метода подгонки перенаправляются на статический метод в классе прокладки. Вам нужно явно выйти за пределы контекста контекста для части кода, который вы хотите выполнить, как обычно.

+0

Спасибо, это именно то, что мне нужно. – user3284063