我想在c#中編寫一個單元測試來測試那些正在進行數據庫操作(2-3個數據庫操作)的方法以及其他一些寫在裏面的邏輯它。我們如何模擬內部有很多數據庫操作的方法
private static APIResponse SubmitRequest(HttpWebRequest request, string info)
{
APIResponse responseObj = new APIResponse();
WebResponse response = null;
// save the log into database.
Log.Request(request.Method + " to " + request.RequestUri.ToString() + ": " + info);
try
{
response = request.GetResponse();
}
catch (WebException e)
{
var resp = (HttpWebResponse)e.Response;
if (resp.StatusCode == HttpStatusCode.NotModified)
{
responseObj.StatusCode = HttpStatusCode.NotModified;
responseObj.Headers = resp.Headers;
eTAG = responseObj.Headers["eTag"];
// save the log into the database.
Log.Response("<empty>");
return responseObj;
}
// save the log into the database.
Log.Warning(e.Message);
response = e.Response;
}
if (response == null)
{
Log.Response("<null>");
return null;
}
StreamReader reader = new StreamReader(response.GetResponseStream());
string textResponse = reader.ReadToEnd();
HttpStatusCode status = ((HttpWebResponse)response).StatusCode;
reader.Close();
response.Close();
if (textResponse != null)
{
textResponse = textResponse.Trim();
}
// save the log into the database.
Log.Response(textResponse.Length == 0 ? "<empty>" : textResponse);
if (textResponse.Length == 0)
return null;
responseObj.Headers = response.Headers;
responseObj.Message = textResponse;
responseObj.StatusCode = status;
eTAG = responseObj.Headers["eTag"];
return responseObj;
}
正如你可以在摘要中看到,我們在代碼的不同時間之間保存記錄到數據庫中。我們如何模擬/停止這些日誌來保存。
public static void Request(string text)
{
-- code to save the code in db.
}
public static void Response(string text)
{
-- code to save the code in db.
}
我們怎麼能實現呢?有人猜測任何人嗎?
能如你所願方法的代碼添加到單元測試請。 – Scrobi
通常,您要提取將數據庫調用爲依賴項的類並通過構造函數注入。這樣你就可以實例化一個測試版/模擬的類,並將其傳遞到你想測試的類 – Stuart
這是一個非常廣泛的問題。你可以模擬數據層本身並返回虛擬數據,或者你可以模擬IQueryable(如果你使用任何),並使用例如字典而不是實際的表。如果您使用EF,則可以模擬EF上下文。您可以使用SQLite內存數據庫而不是實際的數據庫。 EF Core甚至只有用於測試的內存數據庫 –