Könnte jemand mir helfen, Mockobjects einzurichten und zu überprüfen, ob Moq Unit Testing C# verwendet wird?Problem mit Komponententest Mocking Moq
Mein Cache-Klasse ist unten angegeben:
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;
}
}
Und mein Interface ist
public interface ICache
{
void Insert<T>(string cacheKey, T value);
T Get<T>(string cacheKey);
bool Exists<T>(string cacheKey);
}
ich Cachefactory bin mit meiner InMemoryCache Klasse zu nennen:
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;
}
}
I Mock-Objekt versucht, wie unten und nicht in der Lage, das Ergebnis zu erhalten.
[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
}
Könnte jemand mir helfen, dass meine Daten Einsetzen Cache korrekt ist? Helfen Sie mir auch, die Cache-Daten im Komponententest Moq zu überprüfen. Ich bin neu im Komponententest und korrigiere meinen Code bei Bedarf. Ich kann das nicht überprüfen, da ich Daten in den Objektcache in meiner Implementierungsklasse einfüge, aber die Oberfläche spöttisch mache. Ich nehme an, wenn ich beides erzählen könnte, könnte es verifizieren. Nicht sicher, es ist nur meine Vermutung. Es tut mir leid, wenn das dumme Frage ist, aber Ihre Hilfe wird wirklich geschätzt.
Bitte lassen Sie mich wissen, wenn Sie weitere Details dazu benötigen.
Grüße, Viswa V.
Aktualisiert Szenario:
Betrachten wir eine andere Klasse namens "Convertor", die den Grad Namen auf der Grade-ID aus dem Cache auf Basis abruft.
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();
}
}
Für diesen Fall, können Sie mir sagen, wie das zu überprüfen? Da diese Methode den Cache verwendet, um Werte abzurufen, bin ich mir nicht sicher, wie man hier mockt. Ihre Hilfe wird gerne in Anspruch genommen. Vielen Dank.
siehe die markierte Antwort http://stackoverflow.com/questions/5864076/mocking-static-methoden –
Hallo Ioana, danke für dein Update. Ich habe den Link überprüft. Es besagt, dass höhnische statische Methoden nicht möglich sind. In meiner Implementierungsklasse InMemoryCache ist es jedoch nur nicht statisch. Also, ich denke nicht, irgendwelche Probleme zu verspotten. – Viswa