5

「新しいAPI」(ServiceStack.ServiceInterface.Serviceから継承)を使用して、ServiceStackを使用して作成されたいくつかのサービスクラスのユニットテスト(NUnitを使用)を作成することに興味があります。サービスの Db プロパティは、AppHost を使用して ASP.NET アプリケーションでホストされている場合は適切に自動配線されますが、その環境の外で実行する場合の適切な手法を理解できないようです。ServiceStack にはさまざまなテスト関連の名前空間とクラスがありますが、単純に接続ファクトリを直接設定してからさまざまな IDbConnection 拡張メソッドを呼び出すのではなく、サービスの Db プロパティが挿入されている明確な例を見つけることができません (挿入、選択など)。

テスト クラスを ServiceStack.ServiceInterface.Testing.TestBase から継承させ、その Configure メソッドをオーバーライドして IDbConnectionFactory を登録し (":memory:" を使用)、OrmLiteConfig.DialectProvider = SqliteDialect.Provider;TestFixtureSetUp で設定しようとしましたが、NullReferenceException が発生し続けます。サービス メソッドを呼び出します (ServiceStack.ServiceInterface.Service.get_Db() で)。Funq コンテナは何も自動配線していないようです。

SQLite 自体は適切に設定されています。これは、サービス クラスをバイパスして IDbConnection を直接呼び出す単純な単体テストで確認できます。

私は何が欠けていますか?

編集

ServiceStack サービスの単体テストには、ホストとクライアントの存在が必要なようですが、シリアライゼーション コストを回避するためにこれを設定する方法があるようです (ここに示すように、DirectServiceClient を使用) 。私の場合、それを機能させることに成功しました。AppHostHttpListenerBase アプローチ (こちらを参照) を使用してこれを機能させることができましたが、これはユニット 1 というよりも統合テストです (したがって、遅くなります)。

4

1 に答える 1

5

テストに関するドキュメントは、依存関係を注入するためのいくつかの異なるアプローチを示しています。

ベースServiceの実装を見ると、以下からDbを作成するだけIDbConnectionFactoryです。

private IDbConnection db;
public virtual IDbConnection Db
{
    get { return db ?? (db = TryResolve<IDbConnectionFactory>().OpenDbConnection()); }
}

ローカルまたはグローバルIResolverIOC コンテナーから解決されるだけであること:

public static IResolver GlobalResolver { get; set; }

private IResolver resolver;
public virtual IResolver GetResolver()
{
    return resolver ?? GlobalResolver;
}

public virtual T TryResolve<T>()
{
    return this.GetResolver() == null
        ? default(T)
        : this.GetResolver().TryResolve<T>();
}

したがって、独自の依存関係を注入するには (Service 基本クラスを使用する場合) IAppHost、サービスが必要とする依存関係を使用して構成するだけで済みます。

using (var appHost = new BasicAppHost {
    ConfigureContainer = c => {
        c.Register<IDbConnectionFactory>(new ...);
    }
}.Init())
{
  //...    
}

次に、サービスが必要とする独自の依存関係とともに、サービスに設定できます。

var service = appHost.ResolveService<MyService>();

これにより、AppHost で構成されたすべての依存関係が自動配線されます。通常のプロパティ アクセスを使用して、独自のアドホック テスト固有の依存関係を追加することもできます。

var service.MyDependency = new Mock<IMyDependency>().Object;

それ以降は、通常どおり C# クラス メソッドを呼び出してテストするだけです。

var response = service.Get(new RequestDto { ... });
Assert.That(response.Result, Is.Equal("Expected Result from DB"));
于 2013-01-10T18:54:49.503 に答える