最近、ServiceStack(3.9.71)REST API経由でMicrosoft SQLデータベースからDAOを公開する.Netプロジェクトを取りました。私は一部の部分をリファクタリングするつもりだから、私は単体テスト(少なくとも)すべてのサービスのサービスをテストしたい。理解を深めるために、実装の仕組みを簡単に草案します。ユニットテストServiceStackでのServiceStackサービス3.9.71
各サービスは、すべてのデータベースはすべてサービスのアクセスをカプセル化タイプDBService
のプロパティが含まれています。残念ながら、これは模擬するのが難しい具体的なクラスです。 DI.Container
wrappes ServiceStackのIOC
。
public class SomeService : Service
{
public DBService { get { return DI.Container.Resolve<DBService>(); } }
public object Get(SomeDataClass class)
{
var response = DBService.SomeServiceGet();
return response;
}
// other code omitted
}
DBService
は、この(案)のようになります。
public class DBService
{
public IDbConnectionFactory DBFactory { get { return DI.Container.Resolve<IDbConnectionFactory>(); } }
public SomeServiceResponse SomeServiceGet()
{
//DB Access here...
// ...
}
public SomeOtherServiceResponse SomeOtherServiceGet()
{
//...
}
// following about 30 other methods for all the services (POST,GET,PUT etc)
}
私はこのquestionに詳細な回答を読んで、私はすぐにそれ以来ServiceStack 3.9.71でBasicAppHost
を作成および初期化することができませんでしたSystem.TypeLoadExceptionMethod 'get_VirtualPathProvider'
を投げた。
一方、私は実際にはBasicAppHost
は必要ないと思っていました。私はちょうどDBService
のユニットテストをして、何とかサービスサービスを嘲笑してDBService
にしなければなりません。私が持っている唯一の問題は、DBService
はインターフェイスではなく、SQLデータベースとIOC
をどう扱うかわからないということです。
[UPDATE]
は、残念ながら私はまだサービスをテストすることはできませんので私はできない私のテストでちょうどnew
サービス。私がそうするならば、私は得る:
System.TypeLoadExceptionCouldはここで組み立て
から型 'ServiceStack.ServiceHost.IService' をロードしない私のテストです:
[Fact]
public void SomeDataTest()
{
var serviceUnderTest = new SomeService();
var response = serviceUnderTest.Get(new SomeDataClass());
Assert.NotNull(response);
}
私はこの問題を推測しますサービスはIOCを介して注入される多くのプロパティを強く使用するということです。どうすればそれを嘲笑できますか? BasicAppHost
を作成してそこからサービスを取得しても、すでに述べたように動作しません。
問題のクラスのいずれも封印されていない場合は、それらを継承し、テストのために必要な振る舞いをオーバーライドまたは新規作成する独自のクラスを作成できます。嘲笑するのは難しいが不可能ではない。 – Nkosi
私は実際に 'IDbConnectionFactory'のIOC注入について気にする必要はありませんか?私はそれがより良いアプローチであるかどうかも疑問に思っています。そのため、DBServiceのインタフェースを実装して、簡単に嘲笑することができます。 – zlZimon
DbServiceを抽象化すると、テスト容易性が大幅に向上し、使用しているService Locatorのアンチパターンにコンストラクタインジェクションを追加することを検討する必要があります。 – Nkosi