Как добавить фиктивные таблицы БД в тестовые случаи C #

#.net-core #entity-framework-core #xunit #servicetestcase

#.net-core #entity-framework-core #xunit #servicetestcase

Вопрос:

Как создать фиктивные таблицы БД для отдельного файла класса в тестовых примерах для доступа к тестовому варианту службы, а также мне нужны для этого таблицы между родительским и дочерним отношением

  public static class MockTestData
    {
        // Test data for the DbSet<User> getter
        public static IQueryable<EaepTieriiLangComp> Langcomps
        {
            get
            {   return new List<EaepTieriiLangComp>
                {
                     new EaepTieriiLangComp{EaepAssessmentId=1,LangCompId=1,IsPrimary ="Y",LangId =1,LangReadId=1,LangWrittenId=1,LangSpokenId=1,LangUnderstandId=1 },
                     new EaepTieriiLangComp{EaepAssessmentId=2,LangCompId=1 ,IsPrimary ="N",LangId =2,LangReadId=2,LangWrittenId=2,LangSpokenId=2,LangUnderstandId=2 }//Lang =obj,LangRead=objRead,LangSpoken =objSpeak,LangWritten=objWrite,LangUnderstand=objUnderstand
                }.AsQueryable();
            }
        }
        public static IQueryable<LookupLang> LookupLangs
        {
            get
            {   return new List<LookupLang>
                {
                   new LookupLang{LangId = 1,Description = "lang1",IsActive="Y"},
                   new LookupLang{LangId = 2,Description = "lang2",IsActive="N"}
                }.AsQueryable();
            }
        }
}`
  

введите код здесь `
Я пытался использовать вышеупомянутый поток, но я не получил связей для этих таблиц

Ответ №1:

Если вы используете EF Core, вы можете создать базу данных inmemory, добавить данные и выполнить запрос к ней. Вот пример:

Сначала вам нужно установить Microsoft.EntityFrameworkCore.InMemory пакет. После этого создайте параметры:

 _options = new DbContextOptionsBuilder<SomeDbContext>()
            .UseInMemoryDatabase(databaseName: "DbTest")
            .Options;
using var context = new SomeDbContext(_options);
context.Database.EnsureCreated();
  

Затем добавьте свои данные:

  context.AddRange(
   new LookupLang{LangId = 1,Description = "lang1",IsActive="Y"},
   new LookupLang{LangId = 2,Description = "lang2",IsActive="N"}
)
  

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

Комментарии:

1. Я бы действительно рекомендовал этот подход по сравнению с mocking, потому что он также допускает проверку ограничений. Метод C # mocking следует использовать только для имитации сложных сервисов, где объем кода для написания превышает преимущества тестирования

Ответ №2:

Большое спасибо, советую использовать EF core.В пакете памяти теперь все работает нормально, я следовал приведенному ниже коду

Класс Inmemory

 using Assessments.TierIIQueryDataModel;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;

namespace AssessmentCommandTest.Helpers
{
    public class InMemoryDataProviderQueryService : IDisposable
    {

       
        private bool disposedValue = false; // To detect redundant calls

        public DbQueryContext CreateContextForInMemory()
        {
            var option = new DbContextOptionsBuilder<DbQueryContext>().UseInMemoryDatabase(databaseName: "Test_QueryDatabase").Options;

            var context = new DbQueryContext(option);
            if (context != null)
            {
                //context.Database.EnsureDeleted();
                context.Database.EnsureCreated();
            }
            return context;
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                }

                disposedValue = true;
            }
        }

        public void Dispose()
        {
            Dispose(true);
        }
      
    }

}


and access to DbQueryContext conext file in my code and write mock tables as below

using AssessmentCommandTest.Helpers;
using Assessments.TierIIQueryDataModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AssessmentCommandTest.MockDbTables
{
    public class MockQueryDbContext
    {
        public TierIIQueryContext MockTierIIQueryContexts()
        {
           
  

//Создать объект для поставщика базы данных Inmemory
var factory = новый InMemoryDataProviderQueryService();

         //Get the instance of TierIIQueryContext
        var context = factory.CreateContextForInMemory();

        context.LookupLang.Add(new LookupLang { LangId = 1, Description = "Arabic", IsActive = "Y" });
        context.LookupLang.Add(new LookupLang { LangId = 2, Description = "Bangali", IsActive = "Y" });
        context.LookupLang.Add(new LookupLang { LangId = 3, Description = "English", IsActive = "Y" });
        context.LookupLang.Add(new LookupLang { LangId = 4, Description = "French", IsActive = "Y" });
enter code here

context.SaveChanges();
            return context;
        }
    }
}