有人可以帮助我如何设置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