То, что мы решили сделать, это создать класс, в вашем случае это будет LoggingConfiguration
, и он будет передан в конструкцию хранилища. Если вы решите использовать Unity, он создаст экземпляр этого класса, используя Activator
, без необходимости его регистрации. Однако в ваших тестах вы просто добавляете новый экземпляр производного класса конфигурации, предоставляя другие значения.
Имеет ли это смысл? Должен ли я уточнить больше?
Обновление : Я решил дать некоторые дополнительные разъяснения. Итак, у вас уже есть две реализации, и теперь вы хотите, чтобы каждая конфигурация запрашивала правильную настройку конфигурации.
Я бы расширил конструктор ILoggingRepository
, чтобы он выглядел так:
public ILoggingRepository(ILoggingConfigurationProvider confProvider);
Затем вы можете создать одну реализацию для вашей обычной операции, которая имеет два свойства:
public LoggingConfigurationProvider : ILoggingConfigurationProvider {
public LoggingConfigurationProvider() {
// load both values from configuration file
}
public string LogPath { get; set; }
public string ConnectionString { get; set; }
}
Когда вы создаете экземпляр класса с помощью обычной операции IoC, это будет разрешено контейнером, а параметры конфигурации будут загружены из файла conf. Однако, если вы хотите выполнить юнит-тесты, вы:
1) Создать новую реализацию "Mock"
public class MockLoggingConfigurationProvider : ILoggingConfigurationProvider {
public MockLoggingConfigurationProvider() {
// set both values to a test value
}
public string LogPath { get; set; }
public string ConnectionString { get; set; }
}
Теперь вы можете создать репозиторий, используя конструктор:
new LoggingRepository(new MockLoggingConfigurationProvider());
или если вы хотите использовать весь механизм IoC, вы просто (при настройке контейнера) регистрируете эту реализацию интерфейса. Поскольку модульные тесты являются отдельными, вы не разделяете регистрации правильно? Так что это должно дать вам то, что вам нужно, возможность изменять эти настройки в зависимости от того, выполняются они в качестве модульного теста или нет.
В реальной жизни я бы даже не стал этим заниматься, а просто создал бы репозиторий для поддельных журналов и сделал бы его запись где-нибудь еще. Если вы не хотите проверить хранилище в тестовой базе данных / файле. В этом случае я бы сделал, как указано.
Надеюсь, это поможет.