Модульное тестирование EF Core с вводом в память и зависимостями? - PullRequest
0 голосов
/ 09 октября 2018

Пытались использовать ядро ​​провайдера EF в памяти с .Net Dependency инъекцией.Модифицированный исходный документ пример, чтобы включить ядро ​​.Net во встроенный, внедрение зависимостей.

Однако, удалив контекст и снова создав его, не смог получить объект обратно.Не могли бы вы указать мне в правильном направлении.

[TestMethod]
public void Find_searches_url()
{
    var options = new DbContextOptionsBuilder<BloggingContext>()
        .UseInMemoryDatabase(databaseName: "LkBlogs")
        .Options;
    ServiceCollection services = new ServiceCollection();
    services.AddDbContext<BloggingContext>((y) => y.UseInMemoryDatabase(databaseName: "LkBlogs"), ServiceLifetime.Transient);

    ServiceProvider serviceProvider = services.BuildServiceProvider();

    using (var context = serviceProvider.GetService<BloggingContext>())
    {
        context.Blogs.Add(new Blog { Url = "http://sample.com/cats" });
        context.Blogs.Add(new Blog { Url = "http://sample.com/catfish" });
        context.Blogs.Add(new Blog { Url = "http://sample.com/dogs" });
        context.SaveChanges();
        var result = context.Blogs.Find(1);
        Assert.IsNotNull(result, "From same context (which was used for writing, could not retrieve)");
    }

    using (var context = serviceProvider.GetService<BloggingContext>())
    {
        var result = context.Blogs.Find(1);
        Assert.IsNotNull(result, "From new context, instantiated with DI could not retrieve");
    }

    using (var context = new BloggingContext(options))
    {
        var result = context.Blogs.FirstOrDefault();
        //Error: Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException: 'Assert.IsNotNull failed. '
        Assert.IsNotNull(result, "From new context, instantiated without DI could not retrieve");
    }
}

РЕДАКТИРОВАТЬ: Пример документации:

[TestMethod]
        public void Find_searches_url()
        {
            var options = new DbContextOptionsBuilder<BloggingContext>()
                .UseInMemoryDatabase(databaseName: "Find_searches_url")
                .Options;

            // Insert seed data into the database using one instance of the context
            using (var context = new BloggingContext(options))
            {
                context.Blogs.Add(new Blog { Url = "http://sample.com/cats" });
                context.Blogs.Add(new Blog { Url = "http://sample.com/catfish" });
                context.Blogs.Add(new Blog { Url = "http://sample.com/dogs" });
                context.SaveChanges();
            }

            // Use a clean instance of the context to run the test
            using (var context = new BloggingContext(options))
            {
                var service = new BlogService(context);
                var result = service.Find("cat");
                Assert.AreEqual(2, result.Count());
            }
        }

РЕДАКТИРОВАТЬ: 2 Испробовал все сроки службы, SingleTon, Transient & Scoped.Исключение остается тем же.

РЕДАКТИРОВАТЬ: 3 Согласно совету @Chris, удалено использование для Context.Не помогло:

[TestMethod]
    public void Find_searches_url()
    {
        var options = new DbContextOptionsBuilder<BloggingContext>()
            .UseInMemoryDatabase(databaseName: "LkBlogs")
            .Options;
        ServiceCollection services = new ServiceCollection();
        services.AddDbContext<BloggingContext>((y) => y.UseInMemoryDatabase(databaseName: "LkBlogs"),
            ServiceLifetime.Transient);

    ServiceProvider serviceProvider = services.BuildServiceProvider();

    var context = serviceProvider.GetService<BloggingContext>();
    context.Blogs.Add(new Blog {Url = "http://sample.com/cats"});
    context.Blogs.Add(new Blog {Url = "http://sample.com/catfish"});
    context.Blogs.Add(new Blog {Url = "http://sample.com/dogs"});
    context.SaveChanges();
    var result = context.Blogs.Find(1);
    Assert.IsNotNull(result, "From same context (which was used for writing, could not retrieve)");

    var context2 = serviceProvider.GetService<BloggingContext>();
    var result2 = context2.Blogs.Find(1);
    Assert.IsNotNull(result2, "From new context, instantiated with DI could not retrieve");

    var context3 = new BloggingContext(options);
    var result3 = context3.Blogs.FirstOrDefault();
    //Error: Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException: 'Assert.IsNotNull failed. '
    Assert.IsNotNull(result3, "From new context, instantiated without DI could not retrieve");
}
...