Есть ли причина, по которой я не могу иметь конструктор по умолчанию при использовании AddDbContextPool?Я хочу провести модульное тестирование моего dbcontext - PullRequest
0 голосов
/ 16 марта 2019

Когда у меня есть конструктор по умолчанию, например

public MyDbContext()
{
}

, я получаю эту ошибку Ссылка

Но я хочу, чтобы там был конструктор по умолчанию, чтобы я мог объединитьпроверить мою базу данных и проверить, получаю ли я правильный результат.Кстати, я использую MySQL в качестве БД.

1 Ответ

0 голосов
/ 18 марта 2019

Вы должны знать, что ваш DbContext представляет таблицы в вашей базе данных и отношения между этими таблицами.Каждый DbSet<...> в вашем DbContext представляет одну конкретную таблицу.Строки в таблице представлены классом в <...>.

Эти классы должны быть простыми POCO: столбцы вашей таблицы представлены не виртуальными свойствами, виртуальные свойства представляют отношения междутаблицы.

Следовательно, в вашем классе не должно быть ни полей, ни процедур: строка вашей таблицы не знает, как PerformFunction(...), не так ли?

Если вы хотите добавитьфункциональность для строки вашей таблицы, вы должны определить функцию расширения вашего класса.

Но как мне предположить проверить мою базу данных?

Я думаю, еслиВы используете хорошую систему управления базами данных, вам не нужно ее проверять.ИМХО базы данных MicroSoft и MySql протестированы лучше, чем когда-либо.

Однако вы должны проверить, как вы используете свою базу данных!Сохраняете ли вы элементы, которые хотите сохранить, и извлекаете ли вы элементы, которые хотите получить?Вам не нужно беспокоиться о том, правильно ли сущностная структура переводит ваши запросы в SQL.Это проверялось снова и снова.

Существует несколько распространенных методов проверки правильности использования базы данных.

Использование управляемой базы данных в памятипо структуре лица

Это самый простой.Используйте, например, пакет nuget усилия

Одним из конструкторов DbContext является тот, с параметром DbConnection.Этот конструктор используется для подключения к базе данных в памяти:

   class SchoolDbContext : DbContext
{
     public SchoolDbContext() : DbContext
     {
         // default constructor
     }

     public SchoolDbContext(DbConnection connection) : DbContext(dbConnection, false)
     {
         // constructor that uses the in-memory database
     }

     public DbSet<School> Schools {get; set;}
     public DbSet<Student> Students {get; set;}
     ...
}

Использование в тесте:

DbConnection inMemoryDbConnection = Effort.DbConnectionFactory.CreatePersistent(testDbName);
using(var schoolDbContext = new SchoolDbContext(inMemoryConnection);
{
    // TODO: fill the database with test values
    ...
    IEqualityComparer<Student> studentComparer = ...
    var expectedObsoleteStudents = schoolDbContext.Students
        .Where(student => student.Obsolete)
        .ToHashSet(studentComparer);

    // Perform the Test:
    var testObject = new MyClassThatUsesADataBase()
    {
         SchoolDbContext = schoolDbContext();
    }

    // Test function: FetchObsoleteStudents, and check that the expected students are fetched
    var obsoleteStudents = testObject.FetchObsoleteStudents();
    Assert.IsTrue(expectedObsoleteStudents.EqualSet(obsoleteStudents);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...