2016-04-25 13 views
0

ユニットテストをしたいクラスのメンバー変数として使用されるWCFサービスを表すクラスがあります。これにはいくつかのシナリオを記述することになります。問題は、クラスの構築が何回かのユニットテストのすべてに対して 'URIの登録が既に存在します。各ユニットテストのWCFサービスに異なるエンドポイントを使用する

単体テストで成功しますが、同じテストで2つ以上のテストを実行すると問題が発生します。

私の質問は、どのようにすべての単体テストが実行されている標準的なテスト実行で単体テストを実行することができますか?

私のテストコードは次のように起動します:

public CallManager(ICallRouter callRouter) 
{ 
    if (callRouter == null) 
     throw new ArgumentNullException(nameof(callRouter)); 

    this.callRouter = callRouter; 

    this.callRouter.StartCallHandler += CallStarted; 
    this.callRouter.EndCallHandler += CallEnded; 

    hostCallManager = new System.ServiceModel.ServiceHost(callRouter); 
    hostCallManager.Open(); 
} 

と私のapp.configで

は、私が持っている:私のクラスにはコンストラクタがある

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
var serviceModel = ServiceModelSectionGroup.GetSectionGroup(config); 
var services = serviceModel.Services; 
var address = services.Services[serviceName].Endpoints[0].Address; 
var addressParts = address.AbsoluteUri.Split('/'); 
var newAddress = string.Join("/", addressParts.Take(addressParts.Length - 1)); 
newAddress = newAddress + "/" + Guid.NewGuid().ToString(); 
services.Services[0].Endpoints[0].Address = new System.Uri(newAddress); 
config.Save(ConfigurationSaveMode.Modified); 
ConfigurationManager.RefreshSection(serviceModel.Name); 

var callRouter = new CallRouter(); 
var sut = new Callmanager(callRouter); 

だから何を

<system.serviceModel>  
<services> 
    <service name="CallRouter"> 
    <endpoint address="net.tcp://localhost:8011/Service" binding="netTcpBinding" contract="ICallServiceRouter" /> 
    </service> 
</services> 

をI試すのは、各ユニットテストの新しいエンドポイントを即座に生成することです(アドレスを変更してguidを含める)が、私が実行したすべての単体テストを実行したときに、生成された各CallRouterのインスタンスが同じアドレスを使用するため、彼のコードは機能していないようです(アドレスは毎回異なりますので、改正が働いています)。 app.configが使用されています。

これらはすべて同じプロセスから実行され、並行して実行されるので意味があります。ファイルの書き込みが行われ、不運なためconfigがロードされる前に何度も変更されますが、そうである場合、CallRouterのすべてのインスタンスはエンドポイントに対して同じ値を取得します。

System.ServiceModelコンストラクタで使用されるconfigを作成する方法は、同じセッション内の各ユニットテストごとに異なりますか?

答えて

0

設定ファイルを変更する必要はありません。代わりに、サービスインスタンスを作成し、このように、あなたのテストでプログラム的にそれらを設定:

hostCallManager = new ServiceHost(callRouter, new Uri("Unique URI for your test")); 
hostCallManager.AddServiceEndpoint(typeof(ICallServiceRouter), new NetTcpBinding(), string.Empty); 
hostCallManager.Open(); 
+0

が、それは同時に複数のユニットテストを実行できるだけのように(正常に動作します)私の生産コードを変更することを意味します。それは私がしたいことではありません。 – MikeW

+0

ああ、私はCallManagerがプロダクションコードの一部であることを理解していませんでした。 – nodots

関連する問題