2017-01-26 5 views
3

最近、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を作成してそこからサービスを取得しても、すでに述べたように動作しません。

+0

問題のクラスのいずれも封印されていない場合は、それらを継承し、テストのために必要な振る舞いをオーバーライドまたは新規作成する独自のクラスを作成できます。嘲笑するのは難しいが不可能ではない。 – Nkosi

+0

私は実際に 'IDbConnectionFactory'のIOC注入について気にする必要はありませんか?私はそれがより良いアプローチであるかどうかも疑問に思っています。そのため、DBServiceのインタフェースを実装して、簡単に嘲笑することができます。 – zlZimon

+1

DbServiceを抽象化すると、テスト容易性が大幅に向上し、使用しているService Locatorのアンチパターンにコンストラクタインジェクションを追加することを検討する必要があります。 – Nkosi

答えて

0

あなたは自分のサービスクラスをテストしている場合は、直接の依存関係を模擬することができます

[Fact] 
public void SomeDataTest(
{ 
    var serviceUnderTest = new SomeService(); 

    var logger = new Mock<ILogger>(); // Rhino mocks fashion. 
    serviceUnderTest.Logger = logger.Object; 

    var response = serviceUnderTest.Get(new SomeDataClass()); 

    Assert.NotNull(response); 
} 

あなたはAppHost

をテストしたい場合には、ページが統合テストについての彼らの古いドキュメント hereにあります

編集:サービスの依存関係を模擬する例がありますhere