3 Stimmen

Wie kann ich einen Ersatz für die Abfrageerweiterungsmethode, die auf eine NHibernate-Sitzung angewendet wird, mocken oder auf ähnliche Weise injizieren?

Ich versuche, die Abfrageerweiterungsmethode, die auf eine nhibernate-3-Sitzung angewandt wird, nachzubilden oder ähnlich. Ähnlich wie die folgende...

public IQueryable<Entity> GetEntities
{
  return entities = Session.Query<Entity>();
}

Die Erweiterungsmethode Query gibt eine IQueryable-Sammlung zurück.

Ich kann das Session-Objekt mit Moq oder Rhinos eindeutig ausspotten. Aber bis jetzt habe ich noch keinen geeigneten Weg gefunden, um die Erweiterungsmethode auszutricksen oder zu ersetzen. In der Tat Lesen Antworten auf mehrere Fragen auf Stack Overflow, kann es nicht möglich sein.

siehe Fragen Wie spottet man Erweiterungsmethoden mit Rhino Mock? Mocking von Erweiterungsmethoden mit Moq und Links innerhalb.

Ich bin auf die microsoft maulwürfe Projekt und dachte, dass ich damit vielleicht eine Ersatzbaugruppe erstellen könnte, mit der ich diese eine bestimmte Methode testen könnte. Mit Pex ist es relativ einfach, eine solche Baugruppe zu erstellen, aber wenn ich versuche, einen Weg zu finden, diese Baugruppe zu verwenden, ist es nicht sofort klar, wie man das herausrechnen kann.

Idealerweise möchte ich nur überprüfen, um sicherzustellen, dass die Abfrageerweiterung Methode von dieser Methode aufgerufen wird und ein Preempted Ergebnis zurückgegeben wird.

Hat jemand etwas Ähnliches getan, würde gerne die Meinung der anderen hören.

Ps. es gibt Typ Mock, aber ich habe nicht die Mittel, um es zu kaufen :)

2voto

James Kovacs Punkte 11419

Erweiterungsmethoden sind statische Methoden. Sie können also keine Mocking-Bibliothek wie Rhino Mocks oder Moq verwenden. (Dies ist eine CLR-Beschränkung.) TypeMock oder Moles umgehen diese Beschränkung, indem sie sich auf Profiler-Ebene einklinken. (Sie registrieren sich selbst als Profiler und injizieren Code in Ihre App-Domäne.)

Sie können einfach Ihre eigene Erweiterungsmethode mit der gleichen Signatur wie in NHibernate.Linq.LinqExtensionMethods definieren:

// NOT RECOMMENDED!!!
public static class MockedSessionExtensions {
    public static IQueryable<T> Query<T>(this ISession session) {
        // your mocked impl goes here
    }
}

Das Problem dabei ist, dass es in Ihrem Produktionscode mit einigen bedingten Kompilierungsanweisungen um ihn herum sein muss.

Ich persönlich teste die Integration meiner Repositories mit einer lokalen Datenbank oder einer In-Memory-Datenbank wie SQLite. Beim Testen von Komponenten auf höherer Ebene setze ich meine Repositories dann als Mockout ein. Ich würde nicht empfehlen, ISession, ISessionFactory und dergleichen zu mocken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X