2012-02-10 12 views
5

私はMoqとTDDで新しく、私がしようとしているのはリポジトリインタフェースのメソッドを設定することです。MoqフレームワークFunc <T,T>

完全な話です。

私は、問題は、私はドメインサービスを使用し、ここでインターフェースが

public interface IRepository<T> 
{ 
... 
T FindBy(Func<T,bool> func); 
... 
} 

のようなものです。このエンティティのリポジトリを持つプロパティBusinessIdentificationNumber

public class Tenant:EntityBase<Tenant>,IAggregateRoot 
{ 
... 
public string BusinessIdentificationNumber {get;set;} 
... 
} 

次とテナントと呼ばれるドメインエンティティクラスを持っていますテナントを作るためのルールを保持しています。

public class TenantCreationService:ITenantCreationService 
{ 
    public TenantCreationService(IRepository<Tenant> tenantRepository){...} 

    public void CreateTenant(Tenant tenant) 
    { 
     //from here there is call to IRepository<Tenant>.FindBy(funcMethod); 
    } 
} 

そして、ユニットテストで私は、コンストラクタに渡されたリポジトリをあざけり、私は機能をテストしたいと思いますTenantCreationServiceをテストしてい:

  • BusinessIdentificationNumberとテナントが既にストレージやセッションに存在する場合、それが返されるべきです。

だから私は

repositoryMock.Setup(x=>x.FindBy(It.Is<Tenant>(t=>t.BusinessIdentificationNumber 
    == _tenantInTest.BusinessIdentificationNumber))).Returns(_tenantInTest) 

ようにそれをやろうとしたが、それはコンパイルされません。あなたは私が何をしたいのか知っていますか?

編集:私は

repositoryMock.Setup(e => e.FindBy(t => t.BusinessNumber == _validTenant.BusinessNumber)).Returns(
       _validTenant); 

以下のスニペットをコンパイルしようとすると、 i "はBusinessIdentificationNumberとテナントが既にストレージやセッションに存在する場合、それが返されるべきである。" 例外

Unsupported expression: t => (t.BusinessNumber == value(DP.IPagac.UnitTests.DP.IPagac.Module.TenantManagement.TenantDomainServiceTests)._validTenant.BusinessNumber) 
+0

は、あなたの質問でコンパイルエラーを含めることができます。 –

答えて

6

は、私はあなたが、これは(それが動的に嘲笑することができますので、例えば余分だったとITenentを作成したいくつかのことを削除)されacheiveをしようとしているものと思いますか?
+0

はい、findbyメソッドを呼び出して取得しました。私は何をしようとしているのか理解していると思いますが、あなたのコードは私の上でコンパイルされませんでした。私はサポートされていない例外を持っています。t =>(t.BusinessNumber == value)。達成しようとしているwhatiamは、特定のテナントが返されるべきである特定のビジネス番号を持つテナントとのfindbyを呼び出すときに(もちろんテストのために)必要です。 – Ivan

+0

最新のMOQを持っていますか?どのバージョンのフレームワークを使用していますか?上記はコンパイルして、そのままワークステーションでテストに合格します。 –

+0

私はあなたが投稿を編集したことを知らなかったことを申し訳ありません。今それは動作します – Ivan

0

を取得します - このテストの記述から、私はこの振る舞いはあなたがサービスのためのユニットテストでは、サービスクラスにいないで、リポジトリのクラスで

をテストする必要がありますが、テストデータは、レイヤ私はあなたのリポジトリを意味し、 にアクセスしてはならないあなただけのリポジトリことを確認する必要がありますことを理解メソッドFindByが呼び出されました。 と私はIRepositoryのインターフェイスとベースクラスRepostiryから派生するITenantRepositryの作成をお勧めします。

[TestFixture] 
public class Test 
{ 
    [Test] 
    public void CreateTenentAlreadyExistsTest() 
    { 
     var tenentMock = new Mock<ITenant>(); 
     var repoMock = new Mock<IRepository<ITenant>>(); 

     tenentMock.Setup(t => t.BusinessIdentificationNumber).Returns("aNumber"); 

     repoMock.Setup(r => r.FindBy(It.Is<System.Func<ITenant, bool>>(func1 => func1.Invoke(tenentMock.Object)))).Returns(tenentMock.Object); 

     var tenantCreationService = new TenantCreationService(repoMock.Object); 

     tenantCreationService.CreateTenant(tenentMock.Object); 

     tenentMock.VerifyAll(); 
     repoMock.VerifyAll(); 
    } 
} 

public interface ITenant 
{ 
    string BusinessIdentificationNumber { get; set; } 
} 

public class Tenant : ITenant 
{ 
    public string BusinessIdentificationNumber { get; set; } 
} 

public interface IRepository<T> 
{ 
    T FindBy(System.Func<T, bool> func); 
} 

public class TenantCreationService : ITenantCreationService 
{ 
    private readonly IRepository<ITenant> _tenantRepository; 

    public TenantCreationService(IRepository<ITenant> tenantRepository) 
    { 
     _tenantRepository = tenantRepository; 
    } 

    public void CreateTenant(ITenant tenant) 
    { 
     var existingTenant = 
      _tenantRepository.FindBy(t => t.BusinessIdentificationNumber == tenant.BusinessIdentificationNumber); 

     if (existingTenant == null) 
     { 
      //do stuff 
     } 
    } 
} 

public interface ITenantCreationService 
{ 
    void CreateTenant(ITenant tenant); 
} 
+0

しかし、これはサービスクラスでのビジネス行動保留です。私はリポジトリをデータベースからデータを取得するためにのみ使用します。テスト全体がCreateTenant_TenantWithSameIdAlreadyExist_ShouldThrowException()と呼ばれています。実装の詳細についての文は、devの目的のためだけです。ここにビジネスrを提示するのは意味がありません。私はリポジトリの動作をテストしていませんが、事前定義された条件(BusinessID == "123")を持つCreateMethodを呼び出して(そしてその呼び出しをリポジトリに呼び出す)、リポジトリを模擬して、 testfixturesetup – Ivan

関連する問題