Browse Source

Add DI tests

pull/395/head
Halil ibrahim Kalkan 8 years ago
parent
commit
a41f1a51a4
  1. 126
      framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/DependencyInjection_Tests.cs

126
framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/DependencyInjection_Tests.cs

@ -16,11 +16,11 @@ namespace Volo.Abp.DependencyInjection
var services = new ServiceCollection(); var services = new ServiceCollection();
services services
.AddSingleton<MySingletonService>() .AddSingleton<MySingletonServiceUsesTransients>()
.AddTransient<MyTransientServiceUsesSingleton>() .AddTransient<MyTransientServiceUsesSingleton>()
.AddTransient<MyTransientService>(); .AddTransient<MyTransientService>();
MySingletonService singletonService; MySingletonServiceUsesTransients singletonService;
using (var serviceProvider = services.BuildServiceProvider()) using (var serviceProvider = services.BuildServiceProvider())
{ {
@ -36,21 +36,77 @@ namespace Volo.Abp.DependencyInjection
{ {
scope.ServiceProvider.GetRequiredService<MyTransientServiceUsesSingleton>().DoIt(); scope.ServiceProvider.GetRequiredService<MyTransientServiceUsesSingleton>().DoIt();
scope.ServiceProvider.GetRequiredService<MyTransientServiceUsesSingleton>().DoIt(); scope.ServiceProvider.GetRequiredService<MyTransientServiceUsesSingleton>().DoIt();
scope.ServiceProvider.GetRequiredService<MySingletonService>().ShouldNotBeDisposed(); scope.ServiceProvider.GetRequiredService<MySingletonServiceUsesTransients>().ShouldNotBeDisposed();
} }
singletonService = serviceProvider.GetRequiredService<MySingletonService>(); singletonService = serviceProvider.GetRequiredService<MySingletonServiceUsesTransients>();
singletonService.ShouldNotBeDisposed(); singletonService.ShouldNotBeDisposed();
} }
singletonService.ShouldBeDisposed(); singletonService.ShouldBeDisposed();
} }
[Fact]
public void Should_Release_Resolved_Services_When_Main_Service_Is_Disposed()
{
var services = new ServiceCollection();
services
.AddTransient<MyTransientServiceUsesTransients>()
.AddTransient<MyTransientService>();
using (var serviceProvider = services.BuildServiceProvider())
{
MyTransientServiceUsesTransients myTransientServiceUsesTransients;
using (var scope = serviceProvider.CreateScope())
{
myTransientServiceUsesTransients = scope.ServiceProvider.GetRequiredService<MyTransientServiceUsesTransients>();
myTransientServiceUsesTransients.DoIt();
myTransientServiceUsesTransients.DoIt();
myTransientServiceUsesTransients.ShouldNotBeDisposed();
}
myTransientServiceUsesTransients.ShouldBeDisposed();
}
}
[Fact]
public void Inner_Scope_Should_Resolve_New_Scoped_Service()
{
var services = new ServiceCollection();
services
.AddScoped<ScopedServiceWithState>();
using (var serviceProvider = services.BuildServiceProvider())
{
using (var scope = serviceProvider.CreateScope())
{
var service1 = scope.ServiceProvider.GetRequiredService<ScopedServiceWithState>();
var service2 = scope.ServiceProvider.GetRequiredService<ScopedServiceWithState>();
service1.ShouldBe(service2);
using (var innerScope = scope.ServiceProvider.CreateScope())
{
var innserService1 = innerScope.ServiceProvider.GetRequiredService<ScopedServiceWithState>();
var innserService2 = innerScope.ServiceProvider.GetRequiredService<ScopedServiceWithState>();
innserService1.ShouldBe(innserService2);
innserService1.ShouldNotBe(service1);
}
}
}
}
private class MyTransientServiceUsesSingleton private class MyTransientServiceUsesSingleton
{ {
private readonly MySingletonService _singletonService; private readonly MySingletonServiceUsesTransients _singletonService;
public MyTransientServiceUsesSingleton(MySingletonService singletonService) public MyTransientServiceUsesSingleton(MySingletonServiceUsesTransients singletonService)
{ {
_singletonService = singletonService; _singletonService = singletonService;
} }
@ -61,13 +117,13 @@ namespace Volo.Abp.DependencyInjection
} }
} }
private class MySingletonService private class MySingletonServiceUsesTransients
{ {
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
private readonly List<MyTransientService> _instances; private readonly List<MyTransientService> _instances;
public MySingletonService(IServiceProvider serviceProvider) public MySingletonServiceUsesTransients(IServiceProvider serviceProvider)
{ {
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_instances = new List<MyTransientService>(); _instances = new List<MyTransientService>();
@ -104,5 +160,59 @@ namespace Volo.Abp.DependencyInjection
IsDisposed = true; IsDisposed = true;
} }
} }
private class MyTransientServiceUsesTransients
{
private readonly IServiceProvider _serviceProvider;
private readonly List<MyTransientService> _instances;
public MyTransientServiceUsesTransients(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
_instances = new List<MyTransientService>();
}
public void DoIt()
{
_instances.Add(_serviceProvider.GetRequiredService<MyTransientService>());
}
public void ShouldNotBeDisposed()
{
foreach (var instance in _instances)
{
instance.IsDisposed.ShouldBeFalse();
}
}
public void ShouldBeDisposed()
{
foreach (var instance in _instances)
{
instance.IsDisposed.ShouldBeTrue();
}
}
}
private class ScopedServiceWithState
{
private readonly Dictionary<string, object> _items;
public ScopedServiceWithState()
{
_items = new Dictionary<string, object>();
}
public void Set(string name, object value)
{
_items[name] = value;
}
public object Get(string name)
{
return _items[name];
}
}
} }
} }

Loading…
Cancel
Save