簡體   English   中英

使用Moq時,EF 4.1 Code First不會初始化DB(DropCreateDatabaseAlways)

[英]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> 如果需要,您必須為模擬類型實現策略的副本。

模擬上下文的重點是什么,同時期望數據庫存在? 模擬的重點是消除對數據庫的依賴(但它並不總是按預期工作 )。

因此要么使用mock(單元測試及其所有問題 ),要么使用真實上下文和集成測試的數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM