Вход на сайт
Вопрос Программисту - как заменить этот синглтон на его мок?
762 просмотров
Перейти к просмотру всей ветки
Программист коренной житель
в ответ dymanoid 08.11.18 21:31
Ниже вот тебе рабочий код синглтона, чтобы не придирался.
Придраться все равно есть к чему :)
А в этой теме ты мне, пожалуйста, покажи, как ты с internal сеттером к точке доступа к синглтону собираешься его заменить на мок в тесте.
public interface IConfigRepository { int HowManyConfigItems(DateTime oldest); } public class ConfigRepository : IConfigRepository { private static IConfigRepository instance = null; public static IConfigRepository Instance { get { if (instance == null) instance = new ConfigRepository(); return instance; } internal set { instance = value; } } private object userToken; private ConfigRepository() { userToken = UserRepository.Instance.GetUserToken(UserRepository.Instance.CurrentUser); } private IEnumerable GetConfigItems() { using (var conn = new SqlConnection(Properties.Resources.ConnectionString)) { using (var dbContext = new MyDbContext(conn, contextOwnsConnection: true)) { return dbContext.ConfigItems.Where(c => c.UserToken == userToken).ToList(); } } } public virtual int HowManyConfigItems(DateTime oldest) { return GetConfigItems().Count(c => c.CreationDate >= oldest); }
Ну и, конечно, это абсолютно дурацкое решение делать сеттер в синглтоне internal - открываем ворота для всех подряд в сборке, мол, меняйте объект, когда хотите.
Ну с таким же успехом можно сказать, что дурацкое решение - это использование статических объектов в общем и синглтонов в частности.
Если тебе надо "закрыть ворота", то просто положи этот класс в отдельную сборку. Ну или извращайся с рефлекшенами или с хот-патчами.