私のプロジェクトでは、SL5 + MVVM + Prism + WCF + Rx + Moq+Silverlightユニットテストフレームワークを使用しています。
私はユニットテストに不慣れで、最近DI、パターン(MVVM)などを始めました。したがって、次のコードには改善の余地がたくさんあります(そう思う場合は、私が取っているアプローチ全体を拒否してください)。
WCFサービスにアクセスするために、次のようなファクトリクラスを作成しました(ここでも、欠陥がある可能性がありますが、ご覧ください)。
namespace SomeSolution
{
public class ServiceClientFactory:IServiceClientFactory
{
public CourseServiceClient GetCourseServiceClient()
{
var client = new CourseServiceClient();
client.ChannelFactory.Faulted += (s, e) => client.Abort();
if(client.State== CommunicationState.Closed){client.InnerChannel.Open();}
return client;
}
public ConfigServiceClient GetConfigServiceClient()
{
var client = new ConfigServiceClient();
client.ChannelFactory.Faulted += (s, e) => client.Abort();
if (client.State == CommunicationState.Closed) { client.InnerChannel.Open(); }
return client;
}
public ContactServiceClient GetContactServiceClient()
{
var client = new ContactServiceClient();
client.ChannelFactory.Faulted += (s, e) => client.Abort();
if (client.State == CommunicationState.Closed) { client.InnerChannel.Open(); }
return client;
}
}
}
以下のようなシンプルなインターフェースを実装しています。
public interface IServiceClientFactory
{
CourseServiceClient GetCourseServiceClient();
ConfigServiceClient GetConfigServiceClient();
ContactServiceClient GetContactServiceClient();
}
私のVMでは、上記のクラスのDIを実行し、Rxを使用して以下のようにWCFを呼び出しています。
var client = _serviceClientFactory.GetContactServiceClient();
try
{
IObservable<IEvent<GetContactByIdCompletedEventArgs>> observable =
Observable.FromEvent<GetContactByIdCompletedEventArgs>(client, "GetContactByIdCompleted").Take(1);
observable.Subscribe(
e =>
{
if (e.EventArgs.Error == null)
{
//some code here that needs to be unit-tested
}
},
ex =>
{
_errorLogger.ProcessError(GetType().Name, MethodBase.GetCurrentMethod().Name, ErrorSource.Observable, "", -1, ex);
}
);
client.GetContactByIdAsync(contactid, UserInformation.SecurityToken);
}
catch (Exception ex)
{
_errorLogger.ProcessError(GetType().Name, MethodBase.GetCurrentMethod().Name, ErrorSource.Code, "", -1, ex);
}
次に、単体テストを作成します(はい、TDDではありません)。しかし、どこから始めればよいのかわかりません。Moqでは、BlahServiceClientをモックすることはできません。また、非同期メソッドは自動生成されたIBlahServiceインターフェースの一部ではないため、svcutilで生成されたインターフェースは役に立ちません。自動生成されたクラスのいずれかを(部分的なクラスなどを介して)拡張することを好むかもしれませんが、svcutilが生成できるすべてのコードを手動で構築することを選択するのは嫌です(率直に言って時間と予算を考慮して)。
誰か助けてもらえますか?正しい方向へのポインタは私を大いに助けます。