diff options
author | 杨宇千 <crupest@outlook.com> | 2019-08-04 21:30:53 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-08-04 21:30:53 +0800 |
commit | d1ebb882e8484c80eca86cac80602fb4c1401834 (patch) | |
tree | d1c9c7b51353b67b47bb4cd89aa82754ef0a1234 | |
parent | 1f56e4857892150e1109a93fadc487f92d955eed (diff) | |
download | timeline-d1ebb882e8484c80eca86cac80602fb4c1401834.tar.gz timeline-d1ebb882e8484c80eca86cac80602fb4c1401834.tar.bz2 timeline-d1ebb882e8484c80eca86cac80602fb4c1401834.zip |
Fix the database bug in unit tests.
-rw-r--r-- | Timeline.Tests/AuthorizationUnitTest.cs | 6 | ||||
-rw-r--r-- | Timeline.Tests/Helpers/MyWebApplicationFactory.cs | 83 | ||||
-rw-r--r-- | Timeline.Tests/Helpers/WebApplicationFactoryExtensions.cs | 59 | ||||
-rw-r--r-- | Timeline.Tests/TokenUnitTest.cs | 8 | ||||
-rw-r--r-- | Timeline.Tests/UserUnitTest.cs | 6 |
5 files changed, 92 insertions, 70 deletions
diff --git a/Timeline.Tests/AuthorizationUnitTest.cs b/Timeline.Tests/AuthorizationUnitTest.cs index 1f707f15..a25a8f9b 100644 --- a/Timeline.Tests/AuthorizationUnitTest.cs +++ b/Timeline.Tests/AuthorizationUnitTest.cs @@ -8,7 +8,7 @@ using Xunit.Abstractions; namespace Timeline.Tests { - public class AuthorizationUnitTest : IClassFixture<WebApplicationFactory<Startup>> + public class AuthorizationUnitTest : IClassFixture<MyWebApplicationFactory<Startup>> { private const string AuthorizeUrl = "Test/User/Authorize"; private const string UserUrl = "Test/User/User"; @@ -16,9 +16,9 @@ namespace Timeline.Tests private readonly WebApplicationFactory<Startup> _factory; - public AuthorizationUnitTest(WebApplicationFactory<Startup> factory, ITestOutputHelper outputHelper) + public AuthorizationUnitTest(MyWebApplicationFactory<Startup> factory, ITestOutputHelper outputHelper) { - _factory = factory.WithTestConfig(outputHelper); + _factory = factory.WithTestLogging(outputHelper); } [Fact] 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<TStartup> : WebApplicationFactory<TStartup> 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<DatabaseContext>()
+ .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<DatabaseContext>(options =>
+ {
+ options.UseSqlite(_databaseConnection);
+ });
+ })
+ .ConfigureTestServices(services =>
+ {
+ services.AddSingleton<IClock, TestClock>();
+ });
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ _databaseConnection.Close();
+ _databaseConnection.Dispose();
+ }
+
+ base.Dispose(disposing);
+ }
+ } + + public static class WebApplicationFactoryExtensions + { + public static WebApplicationFactory<TEntry> WithTestLogging<TEntry>(this WebApplicationFactory<TEntry> 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<TEntry> WithTestConfig<TEntry>(this WebApplicationFactory<TEntry> 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<DatabaseContext>(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<DatabaseContext>(); - - // Ensure the database is created. - db.Database.EnsureCreated(); - - db.Users.AddRange(TestMockUsers.MockUsers); - db.SaveChanges(); - } - }) - .ConfigureTestServices(services => - {
- services.AddSingleton<IClock, TestClock>();
- }); - }); - } - } -} diff --git a/Timeline.Tests/TokenUnitTest.cs b/Timeline.Tests/TokenUnitTest.cs index 1fe3cff6..7b83cd13 100644 --- a/Timeline.Tests/TokenUnitTest.cs +++ b/Timeline.Tests/TokenUnitTest.cs @@ -6,9 +6,7 @@ using System.Linq; using System.Net;
using System.Net.Http;
using Timeline.Controllers;
-using Timeline.Entities;
using Timeline.Entities.Http;
-using Timeline.Models;
using Timeline.Services;
using Timeline.Tests.Helpers;
using Timeline.Tests.Helpers.Authentication;
@@ -17,16 +15,16 @@ using Xunit.Abstractions; namespace Timeline.Tests
{
- public class TokenUnitTest : IClassFixture<WebApplicationFactory<Startup>>
+ public class TokenUnitTest : IClassFixture<MyWebApplicationFactory<Startup>>
{
private const string CreateTokenUrl = "token/create";
private const string VerifyTokenUrl = "token/verify";
private readonly WebApplicationFactory<Startup> _factory;
- public TokenUnitTest(WebApplicationFactory<Startup> factory, ITestOutputHelper outputHelper)
+ public TokenUnitTest(MyWebApplicationFactory<Startup> factory, ITestOutputHelper outputHelper)
{
- _factory = factory.WithTestConfig(outputHelper);
+ _factory = factory.WithTestLogging(outputHelper);
}
[Fact]
diff --git a/Timeline.Tests/UserUnitTest.cs b/Timeline.Tests/UserUnitTest.cs index a4b4dace..b3377f7b 100644 --- a/Timeline.Tests/UserUnitTest.cs +++ b/Timeline.Tests/UserUnitTest.cs @@ -11,13 +11,13 @@ using Xunit.Abstractions; namespace Timeline.Tests { - public class UserUnitTest : IClassFixture<WebApplicationFactory<Startup>> + public class UserUnitTest : IClassFixture<MyWebApplicationFactory<Startup>> { private readonly WebApplicationFactory<Startup> _factory; - public UserUnitTest(WebApplicationFactory<Startup> factory, ITestOutputHelper outputHelper) + public UserUnitTest(MyWebApplicationFactory<Startup> factory, ITestOutputHelper outputHelper) { - _factory = factory.WithTestConfig(outputHelper); + _factory = factory.WithTestLogging(outputHelper); } [Fact] |