2011-11-08 7 views
1

私はEntity Frameworc 4.1 Code FirstとMoqを使用しています。そして、私はデータベース初期化子をテストしたい。また、私はDbContextから継承した抽象BaseUnitOfWorkクラスを持っています(テストのために嘲笑されるべきです)。EF 4.1 Moqを使用している場合、最初にDB(DropCreateDatabaseAlways)を初期化しません。

public abstract class BaseUnitOfWork : DbContext, IUnitOfWork 
{ 
    ... 
     public IDbSet<User> Users 
     { 
      get 
      { 
       return Set<User>(); 
      } 
     } 
    ... 
} 

ユーザーはID、ログイン、パスワードの3つのプロパティを持つ単純なPOCOです。

そしてここでDbInitializerのコードです:

public class BaseDbInitializer : DropCreateDatabaseAlways<BaseUnitOfWork> 
{ 
    protected override void Seed(BaseUnitOfWork context) 
    { 
     base.Seed(context); 

     context.Set<User>().Add(new User { Login = "admin", Password = "1" }); 
     context.SaveChanges(); 
    } 
} 

私は次のテスト(NUnitのを使用している)で、この初期化子をテストしようとしている:

[TestFixture] 
public class BaseDbInitializerTests 
{ 
    private BaseUnitOfWork _baseUnitOfWork; 

    [TestFixtureSetUp] 
    public void Init() 
    { 
     Database.SetInitializer(new BaseDbInitializer()); 
     _baseUnitOfWork = new Mock<BaseUnitOfWork>(Consts.ConnectionStringName).Object; 
     _baseUnitOfWork.Database.Initialize(true); 
    } 

    [TestFixtureTearDown] 
    public void CleanUp() 
    { 
     _baseUnitOfWork.Dispose(); 
     Database.Delete(Consts.ConnectionStringName); 
    } 

    [Test] 
    public void ShouldInitializeBaseDb() 
    { 
     var repository = new Mock<BaseRepository<User>>(_baseUnitOfWork).Object; 

     var firstUserInDb = repository.FindBy(x => x.Login == "admin" && x.Password == "1").SingleOrDefault(); 

     Assert.That(firstUserInDb, Is.Not.Null); 
     Assert.That(firstUserInDb.Login, Is.EqualTo("admin")); 
     Assert.That(firstUserInDb.Password, Is.EqualTo("1")); 
    } 
} 

残念ながらそれは種子のように思えますBaseDbInitializerクラスのメソッドは実行されません。 DBは再作成されていますが、レコードはありません。このテストをデバッグしようとしましたが、デバッグセッション中にSeedメソッドが実行されました。

答えて

2

戦略DropCreateDatabaseAlways<BaseUnitOfWork>は、派生型ではなくBaseUnitOfWorkの正確な型の一致を探していて、Mock<BaseUnitOfWork>ではありません。必要な場合は、模擬型の戦略のコピーを実装する必要があります。

+0

DropCreateDatabaseIfModelChangesは同じ戦略を使用していますか? – msi

1

コンテキストを嘲笑し、同時にデータベースが存在するとはどういうことでしょうか?模倣の要点は、データベースへの依存性を取り除くことです(ただし、will not always work as expected)。

したがって、実際のコンテキストと統合テストでモック(ユニットテストall its problems)またはデータベースを使用してください。

+0

BaseUnitOfWorkが抽象クラスであるため、モッキングのポイントがあります。私はそれだけを嘲笑している。 – msi

+0

しかし、そのような場合、データベースアクセスを捨てて、データベースを作成する必要はありません。 –

+0

はい、そうです、それは主に理論的な疑問でした。 – msi

関連する問題