Erstellen eines Mock-API für Drittanbieter-Bibliothek in statisch typisierten Sprache?

stimmen
1

Ich habe eine Anwendung in VB / C # .NET, die mit einem dritten Partei API zu interagieren muss, aber ich möchte es als Schnittstelle aus, so kann ich einen Mock-API für Testzwecke verwenden. Hier sind beispielsweise API-Aufrufe ich im Code verwenden würde:

RelayClient.AuthenticateUser(username, password, request, sessionID)
RelayClient.GetUserInfo(sessionID)

Ein paar Probleme, die ich bin vor:

  1. RELAYCLIENT ist nicht vererbbare / Statisch.
  2. RELAYCLIENT implementiert nicht alle Schnittstellen.
  3. Die API-Client-Bibliothek ist geschlossen Quelle.

Gibt es eine standardisierte Möglichkeit, mit dieser Situation umzugehen?

Veröffentlicht am 30/12/2009 um 01:44
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Wenn Sie wollen nicht Ihre eigene Abstraktion rollen, haben einen Blick auf TypeMock Trenner - es Profiler Haken verwendet Runtime - Klasse-Niveau Verspottung so ziemlich alles zu tun, ob Sie es oder nicht besitzen. Es spielt eigentlich eine Laufzeit Substitution des Typs Implementierung und fängt alle Anrufe (zB Sie nicht über die Typ- müssen bis zu Unterklasse , wie die CLR betrifft, so sind Sie der Typ).

Es ist kommerziell, aber sie haben eine kostenlose Testversion haben. Je nachdem, wie groß das Ding müssen Sie verspotten ist, kann die $ 799 die Zeit abstrahiert / Einwickeln der gesamten API Oberfläche wert sein, wenn es nicht eine Schnittstelle basiert.

Beantwortet am 30/12/2009 um 02:14
quelle vom benutzer

stimmen
1

Die Art und Weise, dies zu tun wäre, um Ihren Code Arbeit gegen die ‚Mitte-Mann‘ nicht-statische Klassen zu machen, die intern die statischen Klassen von Ihrem 3rd-Party-API verwenden. Sie verspotten dann diese ‚Mitte-Mann‘ Klassen für die Komponententests.

So etwas wie ... (ungetestet Code)

// your consuming class
public class MyClass
{
    private readonly RelayClientManager manager;

    public MyClass(RelayClientManager manager)
    {
        this.manager = manager;
    }

    public UserInfo GetUserInfo(int sessionID)
    {
        return manager.GetUserInfo(sessionID);
    }    
}

// 'middle-man' class
public class RelayClientManager
{
    public UserInfo GetUserInfo(int sessionID)
    {
        return RelayClient.GetUserInfo(sessionID);
    }
}

// unit test (using xUnit.net and Moq)
[Fact]
public static void GetsUserInfo()
{
    // arrange
    var expected = new UserInfo();
    var manager = new Mock<RelayClientManager>();
    manager.Setup(x => x.GetUserInfo(0)).Returns(expected);
    var target = new MyClass(manager);        

    // act
    var actual = target.GetUserInfo(0);

    // assert
    Assert.Equal(expected, actual);
}
Beantwortet am 30/12/2009 um 06:40
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more