2

TL; DR: MVVMクライアントでViewModelsとWCFサービス間の依存関係を実装するための優れたテスト可能な方法は何ですか?

これを実行しようとしたときに発生した問題の詳細については、残りの質問をお読みください。


wcfサービスに接続するSilverlightクライアントに取り組んでおり、クライアントの単体テストを作成したいと考えています。そのため、ViewModelsでwcfクライアントを使用し、その相互作用をテストするための優れたソリューションを探しています。私はこれまでに2つの解決策を見つけました:

解決策1:これは実際に私が今までそれを実装した方法です:

public class ViewModelExample
{
    public ViewModelExample(IServiceClient client)
    {    
            client.DoWorkCompleted += .. 
            client.DoWorkAsync();
    }
}

//This is how the interface looks like
public interface IServiceClient
{
    event EventHandler<AsyncCompletedEventArgs> DoWorkCompleted;
    void DoWorkAsync();
}

//I was able to put the interface on the generated clients because they are partial classes, like this:
public partial class GeneratedServiceClient : IServiceClient
{

}

良い部分:モックするのは比較的簡単です

悪い部分: 私のサービスクライアントは私のViewModelと同じくらい存続し、同時リクエストがある場合、どの回答がどのリクエストに属しているのかわかりません。

解決策2:この回答に触発された WCFサービスクライアントの存続期間

public class ViewModelExample
{
    public ViewModelExample(IServiceFactory factory)
    {
        var client = factory.CreateClient();
        client.DoWorkCompleted += ...
        client.DoWorkAsync();
    }
}

良い部分:各リクエストは異なるクライアント上にあるため、リクエストと回答を一致させることに問題はありません。

悪い部分:テストするのはもっと難しいです。毎回、ファクトリとwcfクライアントの両方のモックを作成する必要があります。私はすでに200のテストを持っているので、これは私がやりたいことではありません... :(

だから私の質問は、どうやってやるの?ViewModelsはwcfサービスとどのように通信し、依存関係をどこに挿入し、その相互作用をどのようにテストしますか?何かが足りないと感じます。

4

3 に答える 3

1

Func<IServiceClient>クライアントインスタンスの代わりにVMに注入してみてください。このためのクラスを作成する代わりに、「言語レベルのファクトリ」を注入します。ファクトリメソッドでは、クライアントを好きなようにインスタンス化できます(たとえば、アクセスごとに新しいインスタンスを作成できます)。

欠点は、ほとんどの部分でテストに触れる必要があることですが、作業が少なくなると思います。

public ViewModelExample(Func<IServiceClient> factoryMethod)
{
    var client = factoryMethod();
    client.DoWorkCompleted += ...
    client.DoWorkAsync();
}
于 2012-06-20T13:01:34.703 に答える
0

WCFサービスには、それ自体の機能を確認する独自のテストが必要です。

次に、このWCFサービスをモックし、コンシューマー内で単体テストを作成する必要があります。

残念ながら、それは苦痛であり、私たち全員がしなければならないことです。実用的でそれを成し遂げてください、それはあなたが将来噛まれるのを防ぐでしょう。

于 2012-06-20T12:51:34.650 に答える
0

たまたまIoCコンテナを使用していますか?もしそうなら、この問題はコンテナによって完全に軽減されます(IServiceリクエストごとに新しいものとして作成される依存関係を登録するだけです)。

そうでない場合は、

毎回、ファクトリとwcfクライアントの両方のモックを作成する必要があります

この種の「問題」にどのように対処するかです。コストは比較的小さく、おそらくテストごとに2〜3行余分にコードを追加します(必要なのは、ファクトリモックをセットアップしてサービスモックを返すことだけです。どちらの方法でも必要です)。

于 2012-06-20T13:01:30.507 に答える