Чтобы избавиться от зависимостей при тестировании, наиболее распространенным подходом является использование рукописной заглушки или фальшивой среды (например, Moq или RhinoMocks ).
Кроме того, вы должны разрешить пользователям класса StoreManager
передавать зависимость DataBaseConfiguration
, в противном случае вы не сможете заглушить ее без изменения кода. Внедрение в конструктор, как вы делаете сейчас, является обычной практикой и чистым способом сделать это (это становится более удобным, если вы используете контейнер IOC, когда у вас много зависимостей), также смотрите здесь .
Если я вас правильно понимаю, вы просто хотите проверить, что StoreManager
действительно хранит значение, которое вы ему передаете, вас интересует поведение StoreManager
и его взаимодействие с зависимостью DataBaseConfiguration
- верно теперь вы делаете это, запрашивая само хранилище данных для проверки.
Учитывая, что давайте рассмотрим простой пример использования RhinoMocks - единственное, что я изменил, - это определил метод Store
в вашем классе DataBaseConfiguration
как виртуальный, чтобы RhinoMocks мог его переопределить.
//Arrange
string storeValue = "testname";
var dbConfigMock = MockRepository.GenerateMock<DataBaseConfiguration>();
dbConfigMock.Expect(x => x.Store(storeValue));
StoreManager sm = new StoreManager(dbConfigMock);
//Act
sm.Store(storeValue);
//Assert
dbConfigMock.AssertWasCalled(x => x.Store(storeValue));
Этот тест проверяет, что метод Store был вызван для вашего DataBaseConfiguration
класса без каких-либо других зависимостей - он проверяет поведение вашего StoreManager
класса. Этот тест не касается БД и не влияет на другие классы.
Edit:
Я не уверен, что понимаю озабоченность по поводу использования среды разработки в производственном коде - среда разработки используется только в ваших тестовых проектах , ссылки на нее или какие-либо изменения кода не требуются для сам код производства.
Используя рукописную заглушку, вы можете делать те же утверждения «вручную»: определите пробную заглушку, в которой будет храниться сколько раз и с каким значением было вызвано Store()
(опять же, для этого требуется, чтобы метод Store
был объявлен виртуальным, поэтому можно переопределить):
public class DataBaseConfigurationTest : DataBaseConfiguration
{
public int TimesCalled { get; set; }
public string LastNameStored { get; set; }
public DataBaseConfigurationTest()
{
TimesCalled = 0;
}
public override void Store(string name)
{
TimesCalled++;
LastNameStored = name;
}
}
Теперь используйте эту тестовую заглушку в своем тесте вместо "реальной" DataBaseConfiguration
:
string storeValue = "testname";
DataBaseConfigurationTest dbConfigStub = new DataBaseConfigurationTest();
StoreManager sm = new StoreManager(dbConfigStub);
sm.Store(storeValue);
Assert.AreEqual(1, dbConfigStub.TimesCalled);
Assert.AreEqual(storeValue, dbConfigStub.LastNameStored);