From 2a32e03a384a30b14988b0b6e40db845f4a5444e Mon Sep 17 00:00:00 2001 From: 杨宇千 Date: Sun, 4 Aug 2019 21:30:53 +0800 Subject: Fix the database bug in unit tests. --- Timeline.Tests/Helpers/MyWebApplicationFactory.cs | 83 ++++++++++++++++++++++ .../Helpers/WebApplicationFactoryExtensions.cs | 59 --------------- 2 files changed, 83 insertions(+), 59 deletions(-) create mode 100644 Timeline.Tests/Helpers/MyWebApplicationFactory.cs delete mode 100644 Timeline.Tests/Helpers/WebApplicationFactoryExtensions.cs (limited to 'Timeline.Tests/Helpers') diff --git a/Timeline.Tests/Helpers/MyWebApplicationFactory.cs b/Timeline.Tests/Helpers/MyWebApplicationFactory.cs new file mode 100644 index 00000000..903cd670 --- /dev/null +++ b/Timeline.Tests/Helpers/MyWebApplicationFactory.cs @@ -0,0 +1,83 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.AspNetCore.TestHost; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Timeline.Models; +using Timeline.Services; +using Xunit.Abstractions; + +namespace Timeline.Tests.Helpers +{ + public class MyWebApplicationFactory : WebApplicationFactory where TStartup : class + { + // We should keep the connection, so the database is persisted but not recreate every time. + // See https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite#writing-tests . + private readonly SqliteConnection _databaseConnection; + + public MyWebApplicationFactory() : base() + { + _databaseConnection = new SqliteConnection("Data Source=:memory:;"); + _databaseConnection.Open(); + + InitDatabase(); + } + + private void InitDatabase() + { + var options = new DbContextOptionsBuilder() + .UseSqlite(_databaseConnection) + .Options; + + using (var context = new DatabaseContext(options)) + { + context.Database.EnsureCreated(); + context.Users.AddRange(TestMockUsers.MockUsers); + context.SaveChanges(); + } + } + + protected override void ConfigureWebHost(IWebHostBuilder builder) + { + builder.ConfigureServices(services => + { + services.AddEntityFrameworkSqlite(); + services.AddDbContext(options => + { + options.UseSqlite(_databaseConnection); + }); + }) + .ConfigureTestServices(services => + { + services.AddSingleton(); + }); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _databaseConnection.Close(); + _databaseConnection.Dispose(); + } + + base.Dispose(disposing); + } + } + + public static class WebApplicationFactoryExtensions + { + public static WebApplicationFactory WithTestLogging(this WebApplicationFactory factory, ITestOutputHelper outputHelper) where TEntry : class + { + return factory.WithWebHostBuilder(builder => + { + builder.ConfigureLogging(logging => + { + logging.AddXunit(outputHelper); + }); + }); + } + } +} diff --git a/Timeline.Tests/Helpers/WebApplicationFactoryExtensions.cs b/Timeline.Tests/Helpers/WebApplicationFactoryExtensions.cs deleted file mode 100644 index 5a1f97d5..00000000 --- a/Timeline.Tests/Helpers/WebApplicationFactoryExtensions.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc.Testing; -using Microsoft.AspNetCore.TestHost; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Timeline.Models; -using Timeline.Services; -using Xunit.Abstractions; - -namespace Timeline.Tests.Helpers -{ - public static class WebApplicationFactoryExtensions - { - public static WebApplicationFactory WithTestConfig(this WebApplicationFactory factory, ITestOutputHelper outputHelper) where TEntry : class - { - return factory.WithWebHostBuilder(builder => - { - builder - .ConfigureLogging(logging => - { - logging.AddXunit(outputHelper); - }) - .ConfigureServices(services => - { - var serviceProvider = new ServiceCollection() - .AddEntityFrameworkSqlite() - .BuildServiceProvider(); - - services.AddDbContext(options => - { - options.UseSqlite("Data Source=:memory:;"); //TODO! This not work! - options.UseInternalServiceProvider(serviceProvider); - }); - - var sp = services.BuildServiceProvider(); - - // Create a scope to obtain a reference to the database - // context (ApplicationDbContext). - using (var scope = sp.CreateScope()) - { - var scopedServices = scope.ServiceProvider; - var db = scopedServices.GetRequiredService(); - - // Ensure the database is created. - db.Database.EnsureCreated(); - - db.Users.AddRange(TestMockUsers.MockUsers); - db.SaveChanges(); - } - }) - .ConfigureTestServices(services => - { - services.AddSingleton(); - }); - }); - } - } -} -- cgit v1.2.3