Вот где я собирался:
Исправленная фабрика:
public class GenericWebApplicationFactory<TStartup, TContext, TSeed>
: WebApplicationFactory<TStartup>
where TStartup : class
where TContext : DbContext
where TSeed : class, ISeedDataClass
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
base.ConfigureWebHost(builder);
builder.UseEnvironment("Development");
builder.ConfigureServices(services =>
{
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
services.AddSingleton<ISeedDataClass,TSeed >();
services.AddDbContextPool<TContext>(options =>
{
options.UseInMemoryDatabase("InMemoryDbForTesting");
options.UseInternalServiceProvider(serviceProvider);
options.EnableSensitiveDataLogging();
});
var sp = services.BuildServiceProvider();
using (var scope = sp.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var db = scopedServices.GetRequiredService<TContext>();
var logger = scopedServices.GetRequiredService<ILogger<GenericWebApplicationFactory<TStartup, TContext, TSeed>>>();
var seeder = scopedServices.GetRequiredService<ISeedDataClass>();
db.Database.EnsureCreated();
try
{
seeder.InitializeDbForTests();
}
catch (Exception ex)
{
logger.LogError(ex, $"An error occurred seeding the database with test messages. Error: {ex.Message}");
}
}
});
}
}
Исправленная польза:
_client = new GenericWebApplicationFactory<Startup, GatewayContext, SeedDataClass>().CreateClient();
С примером класса семян:
public interface ISeedDataClass
{
void InitializeDbForTests();
}
public class SeedDataClass : ISeedDataClass
{
private readonly GatewayContext _db;
public SeedDataClass(GatewayContext db)
{
_db = db;
}
public void InitializeDbForTests()
{
_db.Users.AddRange(
// add some users here
);
_db.SaveChanges(true);
}
}
Теперь я могу заполнить базу данных в памяти, как я считаю нужным, для каждого проекта, где он используется, и теперь мой GenericWebApplicationFactory
может быть помещен в вспомогательный пакет lib / nuget, который будет повторно использоваться в других проектах .
что-либо после знака хеша (#) является локальной частью URL и не должно вызывать обновление. Кроме того, если Вы имеете #reply в URL в браузере и нажимаете Enter снова в строке поиска, страница не обновлена, Вы просто взяты к #reply части (цель) страницы.
Также отметьте, Вы повреждаете стандарты, не используя полный URL. Необходимо использовать: url=http://server.com/thread.php? $tid#reply id=
PS: Я рекомендовал бы использовать Header("Location: xxxxxxxx");
необходимо поместить обновление в Метатег