2011-07-04 25 views
1

NUnitとMoqを使用して、汎用WCFサービスクライアントラッパーI wroteを使用するクラスをテストしていますが、わからないエラーが発生しました。MoqとNUnitでの実行時の一般的な制約エラー

public interface IService 
{ 
    void Call(); 
} 

...以下のサービスクライアントによって実装:

public class ServiceClient : ClientBase<IService>, IService 
{ 
    public void Call() 
    { 
    } 
} 

...と、以下の一般的な制約で、このクラスでラップ:

public class ServiceClientWrapper<TClient, TService> 
    where TClient : ClientBase<TService>, TService 
    where TService : class 
{ 
    public virtual TService CreateServiceClient() 
    { 
     return (TService)Activator.CreateInstance<TClient>(); 
    } 
} 
私は、次のインタフェースを持っています

テスト可能にするために、私は私が嘲笑できるラッパー工場を持っています。

GenericArguments [0]、 'TService'

// A mock IService to return from my mock service wrapper: 
var mockService = new Mock<IService>(); 

// A mock client wrapper to return from my mock wrapper factory: 
var mockClientWrapper = 
    new Mock<ServiceClientWrapper<ServiceClient, IService>>(); 
mockClientWrapper 
    .Setup(mcw => mcw.CreateServiceClient()) 
    .Returns(mockService.Object); 

// A mock wrapper factory to inject into a client object: 
var mockClientWrapperFactory = new Mock<IServiceClientWrapperFactory>(); 
mockClientWrapperFactory 
    .Setup(mcwf => mcwf.CreateServiceClientWrapper<ServiceClient, IService>()) 
    .Returns(mockClientWrapper.Object); 

// Get the mock client wrapper from the mock wrapper factory - boom! 
mockClientWrapperFactory.Object 
    .CreateServiceClientWrapper<ServiceClient, IService>(); 

エラーがある:

public interface IServiceClientWrapperFactory 
{ 
    ServiceClientWrapper<TClient, TService> 
     CreateServiceClientWrapper<TClient, TService>() 
     where TClient : ClientBase<TService>, TService 
     where TService : class; 
} 

私は、これがこのコードを使用して設定をテスト:ラッパーファクトリインタフェースはこれです 'ServiceClientWrapper`2 [TClient、TService]' は、型 '012Client'のパラメータ の制約に違反しています。私はそれらを述べてきたどこ

制約が同じで、それは...私はIServiceClientWrapperFactoryを実装し、部品番号なしでそれを実行した場合、エラーがスローされていない、任意のアイデアをうまく​​コンパイルし、実行しますか?

+1

'return(TService)Activator.CreateInstanceの代わりに (); '、' new() '制約を追加して直接それを新しいものにすることはできませんでしたか?また、単純な問題を必要以上に困難にしているようです。残りのコードは表示されませんが、単にそれらを使用するクラスに 'IService'を挿入してこのコードをすべて破棄することができるようです。 –

+0

私は本当にクラスを使用することができますが、それはパラメータのないコンストラクタを持っていましたが、[それはありません](http://geekswithblogs.net/mrsteve/archive/2011/06/30/generic-disposable-wcf-service- client.aspx)。質問の目的のために、あなたはその行を無視することができます。良い点は、直接IServiceを注入することですが、実際のアプリケーションではクラスがWCFサービスクライアントを作成しています。これはクラスのクライアントがWCFサービスクライアントを作成する必要があることを意味します...クライアントはファクトリを使用できますが、問題に –

答えて

2

私はコードを少し演奏しましたが、私は同じ結果を得ます。私が知る限り、あなたの定義に間違いはありません。

一般的な制約のさまざまな組み合わせを持つモックを実装すると、Moqにバグがあるようです。

私はさまざまな制約を削除しようとしました(必要に応じて、コメントアウトまたは修正コード)。 TServicewhere TClient : ... , TServiceから削除すると、このエラーは発生しません。

これはさらに、過去に複数の類似のバグがあったという事実によって裏付けられそうです:、FYI

私はあなたの問題をREPROするために使用されるバージョンでした:Moq.4.0.10827、NET40(NET40-RequiresCastle)

+0

ええ、TClient:ClientBase 、TServiceをどこに変更すれば、私は明らかに何かを見逃していないことを確認したかったのです。それを確認していただきありがとうございます:) –

関連する問題