2011-06-24 14 views
0

DomainContext私の単体テストの呼び出しを模擬しようとしています。Silverlight単体テストのInvokeOperationを作成するにはどうすればよいですか?

私の実際のコードは次のとおりです。

public InvokeOperation<bool> CodeIsUnique(string code, Action<InvokeOperation<bool>> action, object userState) 
    { 
     return ObjectContext.CodeIsUnique(code, action, userState); 
    } 

ObjectContextが自動生成されたクラスのインスタンスである:これはです、このコードを介してクライアント側で呼び出され

public class SomeDomainService : LinqToSqlDomainService<SomeDataContext> 
{ 
    [Invoke] 
    public bool CodeIsUnique(string code) 
    { 
     return !this.DataContext.Objects.Any(o => string.Compare(o.Code, code, true) == 0); 
    } 
} 

は、インターフェイスを実装しますSystem.ServiceModel.DomainServices.Client.DomainContextに由来します。これは、ビューモデルから呼び出された場合actionコードが実行されます。

public InvokeOperation<bool> CodeIsUnique(string code, Action<InvokeOperation<bool>> action, object userState) 
    { 
     bool isUnique = !_list.Any(o => string.Compare(o.Code, code) == 0); 
     InvokeOperation<bool> op = ?????; // Here's the problem 

     action.Invoke(op); 

     return op; 
    } 

これは地元を離れて働く:

this.ObjectInterface.CodeIsUnique(currentObject.Code, op => 
    { 
     if (!op.Value) 
     { 
      // Code is not unique set error state. 
     } 
    } 

は、だから私は、サーバーに行かないモック実装を作成しましたList<Object>action.Invoke作品を呼び出すが、ちょうどnullビューモデルコードはopとして失敗した呼び出し中で(明らかに)nullです。

私がする必要があるのは、タイプInvokeOperation<bool>のオブジェクトを作成し、.ValueプロパティをisUniqueに設定することです。しかし、私はこれにどのように働くことができません。最初のインスタンスでは.Valueプロパティは読み取り専用で、2番目のインスタンスではInvokeOperation<T>の公開クリエーターはありません。

テスト用のWebプロジェクトでテスト用のDomainServiceを作成したいと思っています。

答えて

0

OK、これを別の方法で解決しました。むしろ周りInvokeOperationに合格しようとしているよりも、私はこのようにそれを再コード:

public void CodeIsUnique(string code, Action<bool, Exception> action) 
{ 
    return ObjectContext.CodeIsUnique(code, op => 
     { 
      if (op.HasError) 
      { 
       action(false, op.Error); 
       op.MarkErrorAsHandled(); 
      } 
      else 
      { 
       action(op.Value, null); 
      } 
     }, null); 
} 

これは、ビューモデルのコードになったことを意味:

this.ObjectInterface.CodeIsUnique(currentObject.Code, (result, error) => 
    { 
     if (error != null) 
     { 
      // Deal with error 
     } 
     else if (!result) 
     { 
      // Code is not unique set error state. 
     } 
    } 

とテストコードはなるかもしれない。そのため

public void CodeIsUnique(string code, Action<bool, Exception> action) 
{ 
    bool isUnique = !_list.Any(o => string.Compare(o.Code, code) == 0); 
    action(isUnique, null); 
} 

コードは期待通りに機能し、InvokeOperationを作成する必要はありません。