我正在測試一個StoreManager類的功能,該類對DataBaseConfiguration類具有依賴性。在.NET中依賴注入一個未測試類
public class StoreManager {
private DataBaseConfiguration dbConfig;
public void Store(string name) {
dbConfig.Store(name);
}
//other methods here
}
StoreManager類存儲到數據庫,我可以測試此方法是否正常工作的唯一方法是從數據庫中進行查詢。我有另一個類的生產當中做的..
public class QueryManager {
private DataBaseConfiguration dbConfig;
public string Query(QueryExpression expr) {
//query logic
string name = "somename";
return name;
}}
Eventhough我所關心的測試只是我StoreManager類,它看起來對我來說,我需要使用QueryManager類來測試storedvalues。 所以我有一個基本的測試案例像這樣的......
[TestFixture]
public class StoreManagerTest {
[TestFixtureSetup]
public void Setup() {
DatabaseConfiguration dbConfig = new DatabaseConfiguration(/*test database details*/);
StoreManager sm = new StoreManager(dbConfig);
QueryManager qm = new QueryManager(dbConfig);
}
[Test]
public void TestStore_ValidStore() {
sm.Store("testname");
string queryResult = qm.Query(new QueryExpression("query_expr"));
Assert.AreSame(queryResult, "testname");
}}
正如你所看到的,除了ClassUnderTest(這是StoreManager),該QueryManager類也有DatabaseConfig的依賴。
我沒有很多StoreManager類中的邏輯,它只是委託DataBaseConfig類來存儲(實際上有更多類涉及存儲,它不是實際存儲數據的DataBaseConfig ..但只是爲了簡單起見,讓我們這麼說..)
我想知道是否有更好的方式來處理這個測試,而不涉及QueryManager呢? 還有一種更好的方法來將DataBaseConfiguration的依賴注入到StoreManager類中(考慮到DataBaseConfiguration類會將數據庫的連接字符串等細節存儲到..中,並且我想傳入一個測試數據庫,而不是那裏的生產數據庫連接字符串)。
感謝您的解釋!我不確定我們是否可以在我們的生產代碼中使用Rhino Mocks(它看起來像我需要從http://builds.hibernatingrhinos.com/builds/Rhino-Mocks下載Rhino,並在我的源代碼中引用Rhino.Mocks.dll碼)。你會給出一些關於手寫存根在這種情況下的樣子嗎? – Santhosh
@Santosh:更新了一個手寫存根應用於您的示例 – BrokenGlass
非常感謝您的示例代碼! – Santhosh