.net core mocking dbcontext не работает (статическая проблема?) - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь проверить .net core 2.2 API.Я испытываю трудности с издевательством (используя moq) dbcontext.Какой синтаксис для адаптации моего mockDbContext для использования.Я получаю исключение NullReferenceException.Так как Changetracker никогда не создается, я верю.Нужен ли другой подход?Я видел упомянутый .UseInMemoryDatabase (), но с очень небольшим количеством документации или хороших примеров.

Ниже приведен код, который я пытаюсь использовать в моем тесте [Fact].

     var mockDbContext = new Mock<dbContext>(optionsBuilder.Options);
     var controller = new HomeController(mockDbContext.object);

Затем используйтеконтроллер для проверки ... удален для краткости

var datafromdbcontext = controller.GetData();

Ниже приведен пример моего dbcontext.

    public class dbContext:DbContext
    {
        public dbContext(DbContextOptions<dbContext> options)
        : base(options)
        {
            //MAKE IT READONLY
            ChangeTracker.QueryTrackingBehavior = 
       QueryTrackingBehavior.NoTracking;
        }

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я создал библиотеку, доступную в NuGet и GitHub под названием EntityFrameworkCoreMock, которая выполняет тяжелую работу по настройке всего.Также есть реализация для Moq.

https://github.com/huysentruitw/entity-framework-core-mock

Пример использования

public class User
{
    [Key, Column(Order = 0)]
    public Guid Id { get; set; }

    public string FullName { get; set; }
}

public class TestDbContext : DbContext
{
    public TestDbContext(DbContextOptions<TestDbContext> options)
        : base(options)
    {
    }

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

public class MyTests
{
    [Fact]
    public void Test()
    {
        var initialEntities = new[]
        {
            new User { Id = Guid.NewGuid(), FullName = "Eric Cartoon" },
            new User { Id = Guid.NewGuid(), FullName = "Billy Jewel" },
        };

        var dbContextMock = new DbContextMock<TestDbContext>(DummyOptions);
        var usersDbSetMock = dbContextMock.CreateDbSetMock(x => x.Users, initialEntities);

        // Pass dbContextMock.Object to the class/method you want to test

        // Query dbContextMock.Object.Users to see if certain users were added or removed
        // or use Mock Verify functionality to verify if certain methods were called: usersDbSetMock.Verify(x => x.Add(...), Times.Once);
   }

    public DbContextOptions<TestDbContext> DummyOptions { get; } = new DbContextOptionsBuilder<TestDbContext>().Options;
}
0 голосов
/ 08 февраля 2019

Существует множество примеров использования базы данных InMemory (которую вы обычно используете для модульных тестов) ... Вот пример: https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory

Вы не должны пытаться подделать фактическуюконтекст, вместо этого вы используете опцию InMemory.Итак - ваш контекст, но с «опцией» InMemory ... Вот так:

var myFakeContext = new DbContextOptionsBuilder<MYDBCONTEXT>().UseInMemoryDatabase("SO-MADE-UP-NAME"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...