Как написать код первого модульного теста для sqlite с использованием Entitity Framework Core? - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь сделать очень простой отдых API для начинающих. Я создал локальный файл sqlite с помощью инструмента, и он работает. Теперь я хочу написать модульный тест для базы данных.

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

namespace dz1
{
    [Table("User")]
    public class User
    {
        [Key]
        [Column]
        public string Name { get; set; }

        [Column]
        public string Address { get; set; }

        [Column]
        public int Age { get; set; }
    }

    [Table("News")]
    public class News
    {
        [Key]
        [Column]
        public string Title { get; set; }

        [Column]
        public string Content { get; set; }

        [Column]
        [ForeignKey("User")]
        public string Author { get; set; }
    }

    public class MyContext : DbContext
    {
        private readonly string _connectionString;

        public MyContext()
        {
            this._connectionString = "DataSource=./mydb.db";
        }

        public MyContext(string connectionString)
        {
            this._connectionString = connectionString;
        }

        public DbSet<User> Users { get; set; }
        public DbSet<News> News { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite(_connectionString);
        }
    }
}

и код моего модульного теста:

using System;
using System.Linq;
using dz1;
using Xunit;

namespace ApiTest
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            var ctx = new MyContext("DataSource=:memory:");

            ctx.Database.EnsureDeleted();
            ctx.Database.EnsureCreated();

            var u = new User();
            u.Name = "Mirko";
            u.Address = "Tamo 2";
            u.Age = 101;

            ctx.Users.Add(u);
            ctx.SaveChanges();

            Assert.True(ctx.Users.ToList().First().Name == "Mirko");
        }
    }
}

Я прочитал в интернете, что EnsureCreated должно быть достаточно для создания таблицв базе данных в памяти. Чего мне не хватает?

Я получаю сообщение об ошибке

Microsoft.EntityFrameworkCore.DbUpdateException : An error occurred while updating the entries. See the inner exception for details. ---- Microsoft.Data.Sqlite.SqliteException : SQLite Error 1: 'no such table: User'.

Как заставить таблицы создаваться?

Я даже пытался использовать

            RelationalDatabaseCreator databaseCreator =
                (RelationalDatabaseCreator) ctx.Database.GetService<IDatabaseCreator>();

            var s = databaseCreator.GenerateCreateScript();

            ctx.Database.ExecuteSqlRaw(s);

но я не понимаю. Скрипт sql даже не запускается?

1 Ответ

1 голос
/ 30 октября 2019

Выполните следующие действия, чтобы обеспечить его работу.

1) Создайте соединение SQLite для базы данных в памяти

2) Создайте DbContextOptions для соединения SQlite

3) Передайте DbContextOptions в DataContext. Для этого вам нужно иметь перегрузку в DataContext, принимающую DbContextOptions.

4) Вызовите dbContext.Database.EnsureCreated () для создания базы данных.

using(var connection = new SqliteConnection("DataSource=:memory:"))
{
    connection.Open();
    var options = new DbContextOptionsBuilder<DataContext>()
                   .UseSqlite(connection)                  
                   .Options;

    var dbContext = new DataContext(options);
    dbContext.Database.EnsureCreated();

    //You testing logic goes here.
}

5) Добавлениеконструктор перегрузки в DataContext

public DataContext(DbContextOptions<DataContext> options) : base(options)
{

}

6) База данных будет удалена с удалением соединения

Пример кода можно найти в https://github.com/Wijithapaw/PMS/tree/sqlite/PMS.Api

Cheers,

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