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
を実装し、部品番号なしでそれを実行した場合、エラーがスローされていない、任意のアイデアをうまくコンパイルし、実行しますか?
'return(TService)Activator.CreateInstanceの代わりに (); '、' new() '制約を追加して直接それを新しいものにすることはできませんでしたか?また、単純な問題を必要以上に困難にしているようです。残りのコードは表示されませんが、単にそれらを使用するクラスに 'IService'を挿入してこのコードをすべて破棄することができるようです。 –
私は本当にクラスを使用することができますが、それはパラメータのないコンストラクタを持っていましたが、[それはありません](http://geekswithblogs.net/mrsteve/archive/2011/06/30/generic-disposable-wcf-service- client.aspx)。質問の目的のために、あなたはその行を無視することができます。良い点は、直接IServiceを注入することですが、実際のアプリケーションではクラスがWCFサービスクライアントを作成しています。これはクラスのクライアントがWCFサービスクライアントを作成する必要があることを意味します...クライアントはファクトリを使用できますが、問題に –