Зачем создавать новый DbContext для каждого шага теста - PullRequest
1 голос
/ 07 октября 2019

В документации Entity Framework Core по Тестирование с SQLite образец кода создает новый DbContext для каждого шага теста. Есть ли причина для этого?

    // Copied from the docs:
    [Fact]
    public void Add_writes_to_database()
    {
        // In-memory database only exists while the connection is open
        var connection = new SqliteConnection("DataSource=:memory:");
        connection.Open();

        try
        {
            var options = new DbContextOptionsBuilder<BloggingContext>()
                .UseSqlite(connection)
                .Options;

            // Create the schema in the database
            using (var context = new BloggingContext(options))
            {
                context.Database.EnsureCreated();
            }

            // Run the test against one instance of the context
            using (var context = new BloggingContext(options))
            {
                var service = new BlogService(context);
                service.Add("http://sample.com");
                context.SaveChanges();
            }

            // Use a separate instance of the context to verify correct data was saved to database
            using (var context = new BloggingContext(options))
            {
                Assert.Equal(1, context.Blogs.Count());
                Assert.Equal("http://sample.com", context.Blogs.Single().Url);
            }
        }
        finally
        {
            connection.Close();
        }
    }

    // Why not do this instead:
    [Fact]
    public void Add_writes_to_database()
    {
        // In-memory database only exists while the connection is open
        var connection = new SqliteConnection("DataSource=:memory:");
        connection.Open();

        try
        {
            var options = new DbContextOptionsBuilder<BloggingContext>()
                .UseSqlite(connection)
                .Options;

            // Create the schema in the database
            using (var context = new BloggingContext(options))
            {
                context.Database.EnsureCreated();

                var service = new BlogService(context);
                service.Add("http://sample.com");
                context.SaveChanges();

                Assert.Equal(1, context.Blogs.Count());
                Assert.Equal("http://sample.com", context.Blogs.Single().Url);
            }
        }
        finally
        {
            connection.Close();
        }
    }

Почему бы не создать экземпляр контекста один раз и использовать его во всем методе тестирования, как показано во втором примере кода?

1 Ответ

2 голосов
/ 07 октября 2019

Потому что именно так следует использовать контексты . Они должны быть созданы по запросу и утилизированы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...