私は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メソッドが実行されました。
DropCreateDatabaseIfModelChangesは同じ戦略を使用していますか? – msi