Wie teste ich ServiceStack?
Ich liebe SS, aber ich kratzte mir am Kopf, um meine Business-Schicht zu testen. Ich bin neu im Unit-Testen und Verspotten und habe auf NSubstitute nachgelesen, da dies wie eine lustige Verspottungsebene aussieht.
Ich habe meine Dateistruktur ungefähr so:
MainAppHostProject*
|
-AppStart
-AppHost <-- standard apphost
DtoProject*
|
-HelloWorldDto <-- simple POCO to
ServiceLayerProject*
|
-HelloWorldService <-- service interface that merely passes/sends Dtos to/from business layer
BusinessLayerProject*
|
-HelloWorldManager <-- logic to construct response and this class extends 'Service' (letting me access Db, session, etc)...sidenote: maybe i shouldve called this a HelloWorldRepository?
-CustomAuthProvider
-CustomUserSession
DaoProject*
|
-HelloWorldDao <-- POCO of table structure
Der Apphost verweist auf die HelloWorldService-Assembly und registriert die SQL Server-Datenbank als Standard.
Eigentlich funktioniert alles wunderbar und ich konnte die Logik sauberer aufbauen. Leider möchte ich mit Unit-Tests beginnen, aber ich weiß nicht, wie ich die Datenbank entkoppeln soll.
Ich habe versucht, eine Fälschung in der Speicherdatenbank zu registrieren, aber dann denke ich, dass es Inkompatibilitätsprobleme gibt, wie ich Code verwendet habe, um Identitäten usw. auf SQL Server- oder SQLite-Weise abzurufen.
// container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(":memory:", false, SqliteOrmLiteDialectProvider.Instance));
// container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(":memory:", false, SqlServerDialect.Provider));
Ich möchte nur entkoppeln und Unit-Test. Irgendwelche Ideen bitte?
***AKTUALISIEREN
public class UnitTest1
{
private Container container;
[TestMethod]
public void TestMethod1()
{
container = new Container();
// container.Register<IDbConnectionFactory>(new OrmLiteConnectionFactory(":memory:", false, SqliteDialect.Provider));
// sqlite didnt work so attempting with a real DB for now
var connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=XXX;Integrated Security=True";
container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
// dependencies are injecting ok
container.RegisterAutoWiredAs<FeedbackRepo, IFeedbackRepo>();
// service is autowiring --> leading to good injections
container.RegisterAutoWired<FeedbackService>();
var service = container.Resolve<FeedbackService>();
service.SetResolver(new BasicResolver(container));
// unit test is working well
var request = new DTO.FeedbackDto { Message = "test" };
bool result = service.Post(request);
}
}
Im Moment versuche ich, 'Db' dazu zu bringen, in meinen abgeleiteten Serviceklassen nicht mehr null zu sein.