Интеграционный тест на MVC3 EF 4.2 Причины Ошибка: Модель, поддерживающая контекст, изменилась с момента создания базы данных - PullRequest
0 голосов
/ 07 декабря 2011

Я использую MVC3 EF 4.2 Code First с существующей базой данных, использующей шаблон хранилища.

При использовании EF Code First с существующей базой данных инициализатор в Global.asax Application_Start () не устанавливается, и DbSet сопоставляется с таблицами моей базы данных, удаляя соглашение о множественном числе:

    public DbSet<Role> Roles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

Мой стол называется Роль.

Мой первый тест передает фиктивный репозиторий контроллеру.

    [TestMethod]
    public void Index_Contains_All_Roles()
    {
        // Arrange - create the mock repository
        Mock<IRoleRepository> mock = new Mock<IRoleRepository>();
        mock.Setup(m => m.Roles).Returns(new Role[] {
            new Role { Id = 1, Name = "Admin" },
            new Role { Id = 2, Name = "Manager" },
            new Role { Id = 3, Name = "Examiner" },
            new Role { Id = 4, Name = "Examinee" }
        }.AsQueryable());

        // Arrange - create a controller 
        RoleController target = new RoleController(mock.Object);

        // Action
        Role[] result = ((IEnumerable<Role>)target.Index().Model).ToArray();

        // Assert
        Assert.IsTrue(result.Length == 4);
        Assert.AreEqual("Admin", result[0].Name);
        Assert.AreEqual("Manager", result[1].Name);
        Assert.AreEqual("Examiner", result[2].Name);
        Assert.AreEqual("Examinee", result[3].Name);            
    }

Первый тест пройден.

Второй тест - это интеграционный тест, который проверяет, содержит ли база данных правильные роли.

    [TestMethod]
    public void Database_Contains_All_Roles()
    {
        // Arrange - create repository
        IRoleRepository roleRepository = new RoleRepository();

        // Arrange - create a controller 
        RoleController target = new RoleController(roleRepository);

        // Action
        Role[] result = ((IEnumerable<Role>)target.Index().Model).ToArray();

        // Assert
        Assert.IsTrue(result.Length == 4);
        Assert.AreEqual("Admin", result[0].Name);
        Assert.AreEqual("Manager", result[1].Name);
        Assert.AreEqual("Examiner", result[2].Name);
        Assert.AreEqual("Examinee", result[3].Name);
    }

Когда я запускаю этот второй тест, я получаю сообщение об ошибке:

The model backing the 'MyDbContext' context has changed since the database was created

Однако при просмотре фактического контроллера в веб-браузере загружаются правильные данные из базы данных.

Чего мне не хватает?

1 Ответ

0 голосов
/ 07 декабря 2011

Это старая проблема, и для нее требуется установить нулевой инициализатор базы данных в Global.asax

Database.SetInitializer<YourDbContext>(null);
...