我希望這不是太含糊,但我只是在學習使用NUnit和Moq的假貨進行單元測試。我理解這些概念,並且我可以毫無困難地爲執行簡單任務的邏輯方法編寫測試,例如操作某些值或調用僞造的服務。但是我有點摸不着頭腦,試圖弄清楚如何測試像下面這樣的東西,這是一種需要進行數據調用並具有多個依賴關係的方法。如何正確測試? (C#,NUnit,Moq)
這是一類我必須對數據庫進行驗證的用戶:
class Authenticator: IAuthenticator
{
private IConnectionHelper _connHelper;
public Authenticator(IConnectionHelper connHelper)
{
_connHelper = connHelper;
}
public string UserId { get; set; }
public string Password { get; set; }
public UserModel User { get; private set; }
public bool ValidateUser()
{
if (string.IsNullOrEmpty(UserId))
return false;
if (string.IsNullOrEmpty(Password))
return false;
using (Entities db = new Entities(_connHelper))
{
MD5 md5 = MD5.Create();
byte[] inputBytes = Encoding.ASCII.GetBytes(this.Password);
byte[] hash = md5.ComputeHash(inputBytes);
string md5Hash = BitConverter.ToString(hash).ToUpper().Replace("-", string.Empty);
var query = from u in db.Users
where u.UserId.ToUpper().Trim() == this.UserId.ToUpper()
where u.CPassword.Trim() == md5Hash
select u;
this.User = query.FirstOrDefault();
}
if (this.User == null)
{
Log.LogLine(TraceLevel.Verbose, string.Format("Authentication failed for user '{0}'", this.UserId));
return false;
}
else
{
Log.LogLine(TraceLevel.Verbose, string.Format("Successfully authenticated user '{0}'", this.UserId));
return true;
}
}
}
我想創建這樣的測試夾具,但我不確定如何處理它。
我可以模擬IConnectionHelper,並測試如果UserId或密碼爲空/空的方法將失敗,但這是盡我所能。如果IConnectionHelper是假的,那麼我顯然不能測試數據庫的東西,我不知道我應該怎麼做。有人可以在這裏介紹一下最佳實踐嗎?
編輯
從StuartLc接受的答案肯定了我要在正確的方向。我也有做一些額外的設置工作,爲實體框架,基本都採用這個作爲參考:http://msdn.microsoft.com/en-us/data/dn314429.aspx
您需要abstra爲數據庫提供一個界面,以便它可以被模擬。 –
@RyanGates你的意思是抽象的EF DbContext(實體)?或者你的意思是創建另一個服務,我傳遞用戶/ PW到處理數據庫交互?在某些時候,我是否仍然需要測試我的查詢? – amnesia
我認爲測試你的查詢和編程邏輯是兩種不同的測試。每當我編寫單元測試時,我寧願不依賴數據庫。這就是我的做法,但遠不是唯一的辦法。 –