2011-10-23 13 views
2

MoqとMockingには一般的に新しい。一般的なRepositoryFactoryを持ち、いくつかのリポジトリを使用するクラスをテストします。私はこれのように初期化するか、いくつかの良い方法がありますか?一般的な方法を正しく模擬する

Mock<IRepositoryFactory> factory; 
     Mock<IRepository<User>> userRepository; 
     Mock<IRepository<Role>> roleRepository; 
     Mock<IRepository<Meeting>> meetingRepository; 

     [TestInitialize()] 
     public void MyTestInitialize() 
     { 
      meetingRepository = new Mock<IRepository<Meeting>>(); 
      //some meeting setup 

      userRepository = new Mock<IRepository<User>>(); 
      //some user setup 

      roleRepository = new Mock<IRepository<Role>>(); 
      //some role setup 

      factory = new Mock<IRepositoryFactory>(); 
      factory.Setup(f => f.CreateRepository<Meeting>()).Returns(meetingRepository.Object); 
      factory.Setup(f => f.CreateRepository<User>()).Returns(userRepository.Object); 
      factory.Setup(f => f.CreateRepository<Role>()).Returns(roleRepository.Object); 

私はもっとmcuhを持つことができます。

ここで私はすべて私の初期化メソッドでそれをやっていますが、私はそれを個別に行うべきだと思います。

答えて

2

を設定する方法がわかりません。Tごとにリポジトリ設定が異なる可能性があると考えています。それとは別に、機能仕様(this blog postを参照)を使用することができます。これは物事を少しきれいにします。

ご例えば、それは次のようになります。

var factory = Mock.Of<IRepositoryFactory>(
    x => 
    x.CreateRepository<Meeting>() == Mock.Of<IRepository<Meeting>>() && 
    x.CreateRepository<Role>() == Mock.Of<IRepository<Role>>() && 
    x.CreateRepository<User>() == Mock.Of<IRepository<User>>() 
    ); 
1

技術的には、私はあなたのコードに問題が表示されません。

しかし、テストしたいクラスで作業を始めていなくても、すでに4つのモックを持っていて、「はるかに多くのことがあります」というのはちょっと心配です。それはひどい設定のように聞こえる。

[TestInitialize]がわかっていれば、このクラスのすべてのテストで、すべてのリポジトリが同じ方法でセットアップされることを意味します。それは多分異なる条件でテストを指定する方法になるでしょう。

[TestInitialize]を避け、アサーションする特定のテストメソッドに必要なリポジトリを設定し、各リポジトリの設定を共有メソッドに徐々に抽出することをお勧めします。 "Given_User_Of_Type_VIP()"は、VIPセットアップのタイプのユーザーを持つリポジトリを返します。

+0

これは、これがWCFサービスクラスで、いくつかのservicecontractsを実装していることです。私は現在TDDを使用していません。サービスにはRepositoryFactoryクラスしかありませんが、返される可能性があるリポジトリを偽装する必要があります。 –

関連する問題