有人可以幫助我如何設置Mockobjects並驗證使用Moq單元測試c#嗎?單元測試問題Mocking Moq
我的Cache類是如下:
public class InMemoryCache : ICache
{
private readonly ObjectCache _objCache = MemoryCache.Default;
public void Insert<T>(string cacheKey, T value)
{
_objCache.Add(cacheKey, value, DateTimeOffset.MaxValue);
}
public T Get<T>(string cacheKey)
{
if (cacheKey != null)
return (T)Convert.ChangeType(_objCache.Get(cacheKey), typeof(T));
else
return default(T);
}
public bool Exists<T>(string cacheKey)
{
return _objCache.Get(cacheKey) != null;
}
}
我的界面是
public interface ICache
{
void Insert<T>(string cacheKey, T value);
T Get<T>(string cacheKey);
bool Exists<T>(string cacheKey);
}
我使用CacheFactory打電話給我InMemoryCache類:
public class CacheFactory
{
public static ICache Cache { get; set; }
public static void Insert<T>(string cacheKey, T value)
{
Cache.Insert<T>(cacheKey, value);
}
public static T Get<T>(string cacheKey)
{
return Cache.Get<T>(cacheKey);
}
public static bool Exists<T>(string cacheKey)
{
return Cache.Get<T>(cacheKey) != null;
}
}
我試圖仿製對象像下面一樣,無法得到結果。
[Fact()]
public void CacheManager_Insert_Test()
{
string cacheKey = "GradeList";
Mock<ICache> mockObject = new Mock<ICache>();
List<Grade> grades = new List<Grade>
{
new Grade() {Id = 1, Name = "A*"},
new Grade() {Id = 2, Name = "A"},
new Grade() {Id = 3, Name = "B"},
new Grade() {Id = 4, Name = "C"},
new Grade() {Id = 5, Name = "D"},
new Grade() {Id = 6, Name = "E"}
};
var mockedObjectCache = new Mock<ICache>();
// Setup mock's Set method
mockedObjectCache.Setup(m => m.Insert(cacheKey, grades));
// How to get the Mocked data and verify it here
}
有人能幫我,我的數據插入緩存是正確的嗎?還幫助我如何驗證單元測試Moq中的緩存數據。我是單元測試新手,如果需要的話更正我的代碼。我無法驗證,因爲我正在將數據插入到實現類中的對象緩存中,但是卻嘲弄了接口。我想,如果我可以將兩者聯繫起來,那可能是驗證。不知道,它只是我的猜測。我很抱歉,如果這是一個愚蠢的問題,但你的幫助真的很感激。
請讓我知道你是否需要進一步的細節。
問候, Viswa五
更新方案:
考慮其命名爲 「轉換器」,它基於檢索從緩存中的等級標識的等級名稱的另一個類。
public class Convertor
{
// Gets Grade ID and Displays Grade Name
public string GetGradeName(int gradeId)
{
var gradeList = CacheFactory.Cache.Get<List<Grade>>(CacheKeys.Grades);
return gradeList.Where(x => x.Id == gradeId).Select(x => x.Name).FirstOrDefault();
}
}
對於這種情況,你能告訴我如何驗證這個?由於此方法使用緩存來檢索值,因此我不確定如何在此處使用模擬。非常感謝您的幫助。謝謝。
看到標記的答案http://stackoverflow.com/questions/5864076/mocking-static-methods –
嗨Ioana,感謝您的更新。我檢查了鏈接。它告訴我們嘲笑靜態方法是不可能的。但是,在我的實現類InMemoryCache中,它只是非靜態的。所以,我不覺得有什麼麻煩來模擬。 – Viswa