Я использую библиотеку третьей стороны UserContext, который имеет только кучу {получить;}Фиктивные объекты без сеттера
public static UserContext Current { get; }
public UserContact CurrentContact { get; }
public string UserContactName { get; }
В моем коде это просто возвращение CurrentUser как так:
void DoSomething(){
UserContext Current = UserContext.Current; // 3rd party lib
}
У меня нет способа установить новый поддельный объект для модульного тестирования. Таким образом, для того, чтобы посмеяться над этим в моем коде я сделал следующее:
создал подкласс, который наследует от UserContext и перезаписать Текущее свойство:
public class UserContextFake : UserContext
{
public new UserContext Current { get; set; }
}
Затем созданный интерфейс и обертку:
public class UserContextWrapper : IUserContext
{
public UserContextWrapper()
{
userContext = UserContext.Current;
}
public UserContextWrapper(UserContext context)
{
userContext = context;
}
private readonly UserContext userContext;
public UserContext Current
{
get { return userContext; }
}
}
Теперь я могу вставлять userContextWrapper в свои классы. Я раскрываю два конструктора: тот, который использует материал сеанса UserContext.Current (сторонняя библиотека) для производственного кода и конструктор, который может получать пользовательский UserContextFake. В IoC я отображение IUserContext в UserContext
Вопрос: Как издеваются CurrentContact, если это не в интерфейсе, а свойство UserContext (UserContext.CurrentContact)
Что значит правильно? Работает ли это для вас? –
Является ли этот IUserContext реализованным сторонней библиотекой? –
это не так. Вот почему мне пришлось создать оболочку, а затем изменить код в классе, который вызывал UserContext.Current, для ввода IUserContext. И в параметре wrapper less конструктор просто установит private userContext в материал сеанса из стороннего lib – ShaneKm