私はC#で何らかのデータベース操作(2-3のDB操作)を持つメソッドをテストするためにユニットテストを書いています。それ。私たちは多くのデータベース操作を内部に持っているメソッドを模倣することができます
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(もしあれば)を模擬して実際のテーブルの代わりにDictionaryを使うこともできます。 EFを使用する場合、EFコンテキストをモックすることができます。実際のものではなくSQLiteのメモリ内DBを使用することができます。 EFコアには、テスト用のメモリ内DBもあります。 –