Interesuje mnie pisanie testów jednostkowych (przy użyciu NUnit) dla niektórych klas usług utworzonych przy użyciu ServiceStack, przy użyciu "nowego interfejsu API" (dziedziczącego z ServiceStack.ServiceInterface.Service). Właściwość Db usługi jest prawidłowo autoprzewodowa, gdy jest hostowana w aplikacji ASP.NET za pomocą AppHost, ale nie mogę znaleźć odpowiedniej techniki, gdy uruchamiam system poza tym środowiskiem. Widzę różne przestrzenie nazw i klasy związane z testowaniem w ServiceStack, ale nie można znaleźć wyraźnego przykładu, w którym wtłacza się właściwość Db usługi, w przeciwieństwie do prostego konfigurowania fabryki połączeń bezpośrednio, a następnie wywoływania różnych metod rozszerzenia IDbConnection (Insert , Wybierz itd.).Jak wprowadzić Db do klas usług, gdy testowanie jednostki ServiceStack.OrmLite z NUnit?
Próbowałem uwzględniając mój testowy klasy dziedziczą z ServiceStack.ServiceInterface.Testing.TestBase i przesłanianie jego metodę Konfiguruj, aby zarejestrować IDbConnectionFactory (przy użyciu „: pamięci:”), a także ustawienie OrmLiteConfig.DialectProvider = SqliteDialect.Provider;
w moim TestFixtureSetUp, ale nadal aby uzyskać wyjątek NullReferenceException podczas wywoływania moich metod serwisowych (at at ServiceStack.ServiceInterface.Service.get_Db()). Wygląda na to, że w kontenerze Funq nie ma nic automatycznego.
Sam SQLite jest poprawnie skonfigurowany, co mogę potwierdzić za pomocą prostszych testów jednostkowych, które pomijają moje klasy usług i po prostu wykonują bezpośrednie wywołania IDbConnection.
Czego mi brakuje?
Edit
Wydaje się, że usługi jednostka testowanie ServiceStack wymaga istnienia hostem a klientem, chociaż wygląda na to, istnieją sposoby, aby ustawić to aby uniknąć kosztów serializacji (używając DirectServiceClient, jak pokazano here) - chociaż nie udało mi się tego zrobić w moim przypadku. Udało mi się to zrobić przy użyciu podejścia AppHostHttpListenerBase (patrz here), chociaż jest to bardziej test integracyjny niż jednostkowy (i jest odpowiednio wolniejszy).
To działało idealnie! Dzięki! Musiałem przekonwertować jeden z moich ExpectedExceptions z powrotem na wewnętrzny (HttpError) z opakowania (WebServiceException), ale ma to sens, biorąc pod uwagę, że już nie przechodzę przez klienta usługi. –