EF 4.1 Code First не инициализирует DB (DropCreateDatabaseAlways) при использовании Moq - PullRequest
1 голос
/ 09 ноября 2011

Я использую Entity Frameworc 4.1 Code First и Moq .И я хочу проверить инициализатор базы данных.Также у меня есть абстрактный класс BaseUnitOfWork, унаследованный от DbContext (так что для тестирования его следует смоделировать).

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"));
    }
}

К сожалению, похоже,Метод Seed класса BaseDbInitializer не выполняется.БД воссоздается, но записей нет, и я попытался отладить этот тест, и во время сеанса отладки был выполнен метод Seed.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Стратегия DropCreateDatabaseAlways<BaseUnitOfWork> ищет точное совпадение типов BaseUnitOfWork, а не производный тип и не Mock<BaseUnitOfWork>.Если вам это нужно, вам придется реализовать копию стратегии для смоделированного типа.

1 голос
/ 09 ноября 2011

Какой смысл в насмешливом контексте и в то же время ожидать, что база данных будет существовать? Смысл насмешки заключается в удалении зависимости от базы данных (но она не всегда будет работать должным образом ).

Так что используйте либо mock (юнит-тест с всеми его проблемами ), либо базу данных с реальным контекстом и интеграционным тестом.

...