2012-01-12 6 views
5

私は思うに、検索タイプが作成され、サービスレイヤーとドメインタイプのリストが返されるリポジトリに渡されるかなり単純な設定です。検索タイプは、リポジトリメソッドで式ツリーを構築するだけで、基本的にデータベースからの結果が返されます。非常にシンプルモックのコールバックとリターンのどちらを使うのですか?

リポジトリインタフェース:

public interface IDoNotSolicitRepo 
{ 
    IList<DNSContract> SelectWithCriteria(DNS_Search searchriteria); 
} 

リポジトリの実装サービス:

public class DoNotSolicitService : BaseBLLService, IDoNotSolicitService 
{ 
    private readonly IDoNotSolicitRepo repo; 
    private readonly IPartnerService partnerService; 
    private readonly IDoNotSolicitReasonService dnsReasonSvc; 
    public DoNotSolicitService(IDoNotSolicitRepo _repo, IPartnerService _partnerSvc, IDoNotSolicitReasonService _dnsReasonSvc) 
    { 
     repo = _repo; 
     partnerService = _partnerSvc; 
     dnsReasonSvc = _dnsReasonSvc; 
    } 

    public ServiceResult<DNSContract> SelectWithCriteria(DNS_Search searchriteria) 
    { 
     var results = repo.SelectWithCriteria(searchriteria); 

     return ReturnServiceResult(results); 
    } 
} 

を、私はこのプロジェクトで部品番号を学習に取り組んでいると私は「場合、私は把握することはできませんCallback()またはReturn()を使用するはずです。私は両方の全体的なポイントを取得しますが、どちらも私にとってこの時点では適切に動作していないようです。

テスト:

[Test] 
public void SelectWithCriteria_FirstName() 
{ 
    mockRepository.Setup(mr => mr.SelectWithCriteria(It.IsAny<DNS_Search>())) 
     .Returns((IList<DNSContract> records) => new List<DNSContract> 
                { 
                 new DNSContract {FirstName = "unit", LastName = "test"}, 
                 new DNSContract {FirstName = "moq", LastName = "setup"} 
                }); 

    dnsSvc = new DoNotSolicitService(mockRepository.Object, new PartnerServiceStub(), new DoNotSoicitReasonServiceStub()); 

    var result = dnsSvc.SelectWithCriteria(new DNS_Search { FirstName = "unit" }); 

    Assert.IsNotNull(result); 
    Assert.IsTrue(result.Data.Any()); 
} 

エラー:今

System.ArgumentException was unhandled by user code 


Message=Object of type 'EP.Rest.Common.RestHelpers.DNS_Search' cannot be converted to type 'System.Collections.Generic.IList`1[EP.Rest.Domain.Contracts.DNSContract]'. 

、私は戻り値()メソッドは、渡された型を返すので、私はそれが原因だ見ることができることを読みましたそのエラー。しかし現実世界では、私は異なったタイプが返されたかったのです。私はコールバックデリゲートを作成しようとしましたが、どれも正しいとは感じませんでした。

+0

、多分私はスタブVに違反してきました。偽V。モック責任私が何をしたいが、私は、コールバックまたはReturnにまだあいまいです。 – BryanGrimes

+0

[この質問](http://stackoverflow.com/questions/2833162/moq-callback-can-you-help-to-understand-it)の受諾された回答を確認してください。 Moqのドキュメンテーションにもリンクしています。 –

+0

@BryanGrimes、引用された質問にコールバックの例を掲載しましたが、おそらくこれが役に立ちます。 –

答えて

3

だけ.Returnsすなわち

.Returns(new List<DNSContract>()); 

にラムダをドロップあなたの元には、入力に応じて、異なるデータを返すことができるソースから引っ張った場合、たとえば結果をパラメータに戻るにあなたの方法から、引数に渡しています。これを見て

それとも

.Returns<IList<DNSContract>>(new List<DNSContract>(){...}); 
+0

あなたは私の視力と私の正気を保存しました。私はまだそれがコールバックになることができなかった理由を掘り起こす必要があるように見えるが、私のテストは、ありがとう。 – BryanGrimes

関連する問題