Opprette en mock API for tredjeparts bibliotek i statisk skrevet språk?

stemmer
1

Jeg har et program i VB / C # .NET som trenger å samhandle med en tredjepart API, men jeg ønsker å grensesnitt det ut så jeg kan bruke en mock API for testformål. Her er eksempel API-kall jeg ville bruke i kode:

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

Noen problemer jeg står overfor:

  1. RelayClient er NonInheritable / Statisk.
  2. RelayClient ikke implementerer noen grensesnitt.
  3. API-klient Biblioteket er lukket.

Er det noen standard måte å håndtere denne situasjonen?

Publisert på 30/12/2009 klokken 00:44
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Hvis du ikke ønsker å rulle din egen abstraksjon, ta en titt på Typemock Isolator - den bruker Profiler kroker til å gjøre runtime klasse-nivå tentamen på stort sett alt, enten du eier det eller ikke. Det faktisk gjør et bytte av typen implementering og fanger alle samtaler runtime (f.eks du trenger ikke å underklasse type så langt som CLR er opptatt av, er du den typen).

Det er kommersielle, men de har en gratis prøveversjon. Avhengig av hvor stor den tingen du trenger å spotte er, kan $ 799 være vel verdt tiden abstrahere / innpakning hele API overflaten hvis det ikke grensesnitt-basert.

Svarte 30/12/2009 kl. 01:14
kilden bruker

stemmer
1

Måten å gjøre dette ville være å gjøre koden arbeidet mot 'midt-mann' ikke-statiske klasser, som internt bruker statiske klasser fra tredje part API. Deretter spotte ut disse 'midt-mann' klasser for enhet tester.

Noe som ... (utestet kode)

// 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);
}
Svarte 30/12/2009 kl. 05:40
kilden bruker

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