[英]EF 4.1 Code First doesn't initialize DB (DropCreateDatabaseAlways) when using Moq
我正在使用Entity Frameworc 4.1 Code First和Moq 。 我想測試數據庫初始化程序。 我還有從DbContext繼承的抽象BaseUnitOfWork類(所以,為了測試它應該被模擬)。
public abstract class BaseUnitOfWork : DbContext, IUnitOfWork
{
...
public IDbSet<User> Users
{
get
{
return Set<User>();
}
}
...
}
用戶是簡單的POCO,有三個屬性:Id,Login,Password。
這是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類的Seed方法似乎沒有執行。 數據庫正在重新創建,但是沒有任何記錄,我嘗試調試該測試,並且在調試會話期間執行了Seed方法。
該策略DropCreateDatabaseAlways<BaseUnitOfWork>
正在尋找的精確類型匹配BaseUnitOfWork
,不是派生型的,而不是Mock<BaseUnitOfWork>
如果需要,您必須為模擬類型實現策略的副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.