2013-12-09 2 views
4

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

System.Fakes.ShimDateTime.NowGet =() => DateTime.Now.AddDays(-1); 

В приведенном выше коде, все, что мы хотим сделать, когда DateTime.Now называется, чтобы вернуться в день меньше, чем фактическая дата. Возможно, это похоже на надуманный пример, поэтому другие (более) реалистичные сценарии:

  1. Уметь фиксировать и проверять значения аргументов, передаваемые конкретному методу.
  2. Чтобы иметь возможность подсчитывать количество раз , конкретный метод/свойство запрашивается тестируемым кодом.

Я столкнулся с последним сценарием в реальном приложении и не смог найти ответ на Fakes on SO. Однако после того, как вы выкапываете документацию Fakes, я нашел ответ, разместив его вместе с вопросом для сообщества.

ответ

8

Подделки имеют встроенную поддержку для этого; на самом деле для достижения этой цели есть two ways.

1) Использование ShimsContext.ExecuteWithoutShims() в качестве оболочки для кода вам не нужно регулировочная шайба поведение:

System.Fakes.ShimDateTime.NowGet =() => 
{ 
return ShimsContext.ExecuteWithoutShims(() => DateTime.Now.AddDays(-1)); 
}; 

2) Другой подход состоит в установке регулировочной шайбы обнулить, вызовите оригинальный метод и восстановите прокладку.

FakesDelegates.Func<DateTime> shim = null; 
shim =() => 
{ 
System.Fakes.ShimDateTime.NowGet = null; 
var value = ShimsContext.ExecuteWithoutShims(() => DateTime.Now.AddDays(-1)); 
System.Fakes.ShimDateTime.NowGet = shim; 
return value; 
}; 
System.Fakes.ShimDateTime.NowGet = shim; 

Редактировать: Очевидно, что первый подход более лаконичен и читабельен. Я предпочитаю его явно декларировать переменную шайбы и удалять/восстанавливать прокладку.