Repository navigation
Expand file tree
/
Copy pathServiceProviderInfrastructureTests.cs
More file actions
172 lines (142 loc) · 5.5 KB
/
Copy pathServiceProviderInfrastructureTests.cs
File metadata and controls
172 lines (142 loc) · 5.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
using TUnit.Assertions.Extensions;
using TUnit.Core.Services;
namespace TUnit.UnitTests;
/// <summary>
/// Tests for service provider infrastructure and dependency injection
/// </summary>
public class ServiceProviderInfrastructureTests
{
[Test]
public async Task TestServiceProvider_CanRegisterAndResolveService()
{
// Arrange
var serviceProvider = new TestServiceProvider();
var testService = new TestService { Name = "Test Service" };
// Act
serviceProvider.AddSingleton<ITestService>(testService);
var resolvedService = serviceProvider.GetService<ITestService>();
// Assert
await Assert.That(resolvedService).IsNotNull();
await Assert.That(resolvedService).IsEqualTo(testService);
await Assert.That(resolvedService!.Name).IsEqualTo("Test Service");
}
[Test]
public async Task TestServiceProvider_CanRegisterFactory()
{
// Arrange
var serviceProvider = new TestServiceProvider();
var factoryCallCount = 0;
// Act
serviceProvider.AddTransient<ITestService>(() =>
{
factoryCallCount++;
return new TestService { Name = $"Factory Service {factoryCallCount}" };
});
var service1 = serviceProvider.GetService<ITestService>();
var service2 = serviceProvider.GetService<ITestService>();
// Assert
await Assert.That(service1).IsNotNull();
await Assert.That(service2).IsNotNull();
await Assert.That(service1!.Name).IsEqualTo("Factory Service 1");
await Assert.That(service2!.Name).IsEqualTo("Factory Service 2");
await Assert.That(factoryCallCount).IsEqualTo(2);
}
[Test]
public async Task TestServiceProvider_GetRequiredService_ThrowsWhenNotRegistered()
{
// Arrange
var serviceProvider = new TestServiceProvider();
// Act & Assert
await Assert.That(() => serviceProvider.GetRequiredService<ITestService>())
.Throws<InvalidOperationException>()
.WithMessageContaining("Service of type")
.And.HasMessageContaining("ITestService")
.And.HasMessageContaining("is not registered");
}
[Test]
public async Task TestServiceProvider_GetService_ReturnsNullWhenNotRegistered()
{
// Arrange
var serviceProvider = new TestServiceProvider();
// Act
var service = serviceProvider.GetService<ITestService>();
// Assert
await Assert.That(service).IsNull();
}
[Test]
public async Task TestServiceProvider_SupportsInterfaceAndConcreteTypes()
{
// Arrange
var serviceProvider = new TestServiceProvider();
var concreteService = new TestService { Name = "Concrete" };
// Act
serviceProvider.AddSingleton<TestService>(concreteService);
serviceProvider.AddSingleton<ITestService>(concreteService);
var resolvedConcrete = serviceProvider.GetService<TestService>();
var resolvedInterface = serviceProvider.GetService<ITestService>();
// Assert
await Assert.That(resolvedConcrete).IsEqualTo(concreteService);
await Assert.That(resolvedInterface).IsEqualTo(concreteService);
await Assert.That((object?)resolvedConcrete).IsEqualTo(resolvedInterface);
}
[Test]
public async Task TestContext_HasWorkingServiceProvider()
{
// Arrange & Act
var context = TestContext.Current;
var serviceProvider = context?.ServiceProvider;
// Assert
await Assert.That(context).IsNotNull();
await Assert.That(serviceProvider).IsNotNull();
}
[Test]
public async Task TestServiceProvider_CanOverrideRegistration()
{
// Arrange
var serviceProvider = new TestServiceProvider();
var firstService = new TestService { Name = "First" };
var secondService = new TestService { Name = "Second" };
// Act
serviceProvider.AddSingleton<ITestService>(firstService);
serviceProvider.AddSingleton<ITestService>(secondService);
var resolvedService = serviceProvider.GetService<ITestService>();
// Assert
await Assert.That(resolvedService).IsEqualTo(secondService);
await Assert.That(resolvedService!.Name).IsEqualTo("Second");
}
[Test]
public async Task TestServiceProvider_HandlesMultipleServiceTypes()
{
// Arrange
var serviceProvider = new TestServiceProvider();
var testService = new TestService { Name = "Test" };
var otherService = new OtherService { Value = 42 };
// Act
serviceProvider.AddSingleton<ITestService>(testService);
serviceProvider.AddSingleton<IOtherService>(otherService);
var resolvedTest = serviceProvider.GetService<ITestService>();
var resolvedOther = serviceProvider.GetService<IOtherService>();
// Assert
await Assert.That(resolvedTest).IsNotNull();
await Assert.That(resolvedOther).IsNotNull();
await Assert.That(resolvedTest!.Name).IsEqualTo("Test");
await Assert.That(resolvedOther!.Value).IsEqualTo(42);
}
// Test service interfaces and implementations
public interface ITestService
{
string Name { get; set; }
}
public class TestService : ITestService
{
public string Name { get; set; } = "";
}
public interface IOtherService
{
int Value { get; set; }
}
public class OtherService : IOtherService
{
public int Value { get; set; }
}
}