Skip to content

Commit a20ae03

Browse files
authored
Merge pull request #343 from nanotaboada/refactor/issue-320-use-ihostenvironment
refactor: use IHostEnvironment instead of Environment variables (#320)
2 parents 7657bc9 + 5cdc9e5 commit a20ae03

3 files changed

Lines changed: 38 additions & 60 deletions

File tree

src/Dotnet.Samples.AspNetCore.WebApi/Services/PlayerService.cs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ public class PlayerService(
99
IPlayerRepository playerRepository,
1010
ILogger<PlayerService> logger,
1111
IMemoryCache memoryCache,
12-
IMapper mapper
12+
IMapper mapper,
13+
IHostEnvironment environment
1314
) : IPlayerService
1415
{
1516
/// <summary>
@@ -27,20 +28,6 @@ IMapper mapper
2728
/// </summary>
2829
private static readonly string CacheKey_RetrieveAsync = nameof(RetrieveAsync);
2930

30-
/// <summary>
31-
/// The key used to store the environment variable for ASP.NET Core.
32-
/// <br/>
33-
/// <see href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-8.0">
34-
/// Use multiple environments in ASP.NET Core
35-
/// </see>
36-
/// </summary>
37-
private static readonly string AspNetCore_Environment = "ASPNETCORE_ENVIRONMENT";
38-
39-
/// <summary>
40-
/// The value used to check if the environment is Development.
41-
/// </summary>
42-
private static readonly string Development = "Development";
43-
4431
/* -------------------------------------------------------------------------
4532
* Create
4633
* ---------------------------------------------------------------------- */
@@ -68,7 +55,7 @@ public async Task<List<PlayerResponseModel>> RetrieveAsync()
6855
}
6956
else
7057
{
71-
if (Environment.GetEnvironmentVariable(AspNetCore_Environment) == Development)
58+
if (environment.IsDevelopment())
7259
{
7360
await SimulateRepositoryDelayAsync();
7461
}

test/Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

Lines changed: 28 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,8 @@
77

88
namespace Dotnet.Samples.AspNetCore.WebApi.Tests.Unit;
99

10-
public class PlayerServiceTests : IDisposable
10+
public class PlayerServiceTests
1111
{
12-
private bool _disposed;
13-
14-
public PlayerServiceTests()
15-
{
16-
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
17-
}
18-
1912
/* -------------------------------------------------------------------------
2013
* Create
2114
* ---------------------------------------------------------------------- */
@@ -27,14 +20,15 @@ public async Task GivenCreateAsync_WhenRepositoryAddAsync_ThenAddsPlayerToReposi
2720
// Arrange
2821
var request = PlayerFakes.MakeRequestModelForCreate();
2922
var response = PlayerFakes.MakeResponseModelForCreate();
30-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
23+
var (repository, logger, memoryCache, mapper, environment) = PlayerMocks.InitServiceMocks();
3124
mapper.Setup(mapper => mapper.Map<PlayerResponseModel>(request)).Returns(response);
3225

3326
var service = new PlayerService(
3427
repository.Object,
3528
logger.Object,
3629
memoryCache.Object,
37-
mapper.Object
30+
mapper.Object,
31+
environment.Object
3832
);
3933

4034
// Act
@@ -61,15 +55,16 @@ public async Task GivenRetrieveAsync_WhenRepositoryGetAllAsyncReturnsPlayers_The
6155
var value = It.IsAny<object>();
6256
var players = PlayerFakes.MakeStarting11();
6357
var response = PlayerFakes.MakeResponseModelsForRetrieve();
64-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
58+
var (repository, logger, memoryCache, mapper, environment) = PlayerMocks.InitServiceMocks();
6559
repository.Setup(repository => repository.GetAllAsync()).ReturnsAsync(players);
6660
mapper.Setup(mapper => mapper.Map<List<PlayerResponseModel>>(players)).Returns(response);
6761

6862
var service = new PlayerService(
6963
repository.Object,
7064
logger.Object,
7165
memoryCache.Object,
72-
mapper.Object
66+
mapper.Object,
67+
environment.Object
7368
);
7469

7570
// Act
@@ -94,15 +89,16 @@ public async Task GivenRetrieveAsync_WhenExecutedForTheSecondTime_ThenSecondExec
9489
var value = It.IsAny<object>();
9590
var players = PlayerFakes.MakeStarting11();
9691
var response = PlayerFakes.MakeResponseModelsForRetrieve();
97-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
92+
var (repository, logger, memoryCache, mapper, environment) = PlayerMocks.InitServiceMocks();
9893
repository.Setup(repository => repository.GetAllAsync()).ReturnsAsync(players);
9994
mapper.Setup(mapper => mapper.Map<List<PlayerResponseModel>>(players)).Returns(response);
10095

10196
var service = new PlayerService(
10297
repository.Object,
10398
logger.Object,
10499
memoryCache.Object,
105-
mapper.Object
100+
mapper.Object,
101+
environment.Object
106102
);
107103

108104
// Act
@@ -129,14 +125,15 @@ public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsNull_
129125
{
130126
// Arrange
131127
var id = Guid.NewGuid();
132-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
128+
var (repository, logger, memoryCache, mapper, environment) = PlayerMocks.InitServiceMocks();
133129
repository.Setup(repository => repository.FindByIdAsync(id)).ReturnsAsync(null as Player);
134130

135131
var service = new PlayerService(
136132
repository.Object,
137133
logger.Object,
138134
memoryCache.Object,
139-
mapper.Object
135+
mapper.Object,
136+
environment.Object
140137
);
141138

142139
// Act
@@ -157,15 +154,16 @@ public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsPlaye
157154
var squadNumber = 10;
158155
var player = PlayerFakes.MakeFromStarting11(squadNumber);
159156
var response = PlayerFakes.MakeResponseModelForRetrieve(squadNumber);
160-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
157+
var (repository, logger, memoryCache, mapper, environment) = PlayerMocks.InitServiceMocks();
161158
repository.Setup(repository => repository.FindByIdAsync(id)).ReturnsAsync(player);
162159
mapper.Setup(mapper => mapper.Map<PlayerResponseModel>(player)).Returns(response);
163160

164161
var service = new PlayerService(
165162
repository.Object,
166163
logger.Object,
167164
memoryCache.Object,
168-
mapper.Object
165+
mapper.Object,
166+
environment.Object
169167
);
170168

171169
// Act
@@ -184,7 +182,7 @@ public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumbe
184182
{
185183
// Arrange
186184
var squadNumber = 999;
187-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
185+
var (repository, logger, memoryCache, mapper, environment) = PlayerMocks.InitServiceMocks();
188186
repository
189187
.Setup(repository => repository.FindBySquadNumberAsync(squadNumber))
190188
.ReturnsAsync(null as Player);
@@ -193,7 +191,8 @@ public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumbe
193191
repository.Object,
194192
logger.Object,
195193
memoryCache.Object,
196-
mapper.Object
194+
mapper.Object,
195+
environment.Object
197196
);
198197

199198
// Act
@@ -216,7 +215,7 @@ public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumbe
216215
var squadNumber = 10;
217216
var player = PlayerFakes.MakeFromStarting11(squadNumber);
218217
var response = PlayerFakes.MakeResponseModelForRetrieve(squadNumber);
219-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
218+
var (repository, logger, memoryCache, mapper, environment) = PlayerMocks.InitServiceMocks();
220219
repository
221220
.Setup(repository => repository.FindBySquadNumberAsync(squadNumber))
222221
.ReturnsAsync(player);
@@ -226,7 +225,8 @@ public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumbe
226225
repository.Object,
227226
logger.Object,
228227
memoryCache.Object,
229-
mapper.Object
228+
mapper.Object,
229+
environment.Object
230230
);
231231

232232
// Act
@@ -254,7 +254,7 @@ public async Task GivenUpdateAsync_WhenRepositoryFindBySquadNumberAsyncReturnsPl
254254
var squadNumber = 23;
255255
var player = PlayerFakes.MakeFromStarting11(squadNumber);
256256
var request = PlayerFakes.MakeRequestModelForUpdate(squadNumber);
257-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
257+
var (repository, logger, memoryCache, mapper, environment) = PlayerMocks.InitServiceMocks();
258258
repository
259259
.Setup(repository => repository.FindBySquadNumberAsync(squadNumber))
260260
.ReturnsAsync(player);
@@ -263,7 +263,8 @@ public async Task GivenUpdateAsync_WhenRepositoryFindBySquadNumberAsyncReturnsPl
263263
repository.Object,
264264
logger.Object,
265265
memoryCache.Object,
266-
mapper.Object
266+
mapper.Object,
267+
environment.Object
267268
);
268269

269270
// Act
@@ -293,7 +294,7 @@ public async Task GivenDeleteAsync_WhenRepositoryFindBySquadNumberAsyncReturnsPl
293294
// Arrange
294295
var squadNumber = 26;
295296
var player = PlayerFakes.MakeFromStarting11(squadNumber);
296-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
297+
var (repository, logger, memoryCache, mapper, environment) = PlayerMocks.InitServiceMocks();
297298
repository
298299
.Setup(repository => repository.FindBySquadNumberAsync(squadNumber))
299300
.ReturnsAsync(player);
@@ -302,7 +303,8 @@ public async Task GivenDeleteAsync_WhenRepositoryFindBySquadNumberAsyncReturnsPl
302303
repository.Object,
303304
logger.Object,
304305
memoryCache.Object,
305-
mapper.Object
306+
mapper.Object,
307+
environment.Object
306308
);
307309

308310
// Act
@@ -327,19 +329,4 @@ private static async Task<long> ExecutionTimeAsync(Func<Task> awaitable)
327329

328330
return stopwatch.ElapsedMilliseconds;
329331
}
330-
331-
protected virtual void Dispose(bool disposing)
332-
{
333-
if (!_disposed)
334-
{
335-
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", null);
336-
_disposed = true;
337-
}
338-
}
339-
340-
public void Dispose()
341-
{
342-
Dispose(true);
343-
GC.SuppressFinalize(this);
344-
}
345332
}

test/Dotnet.Samples.AspNetCore.WebApi.Tests/Utilities/PlayerMocks.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Microsoft.AspNetCore.Mvc;
88
using Microsoft.AspNetCore.Mvc.Routing;
99
using Microsoft.Extensions.Caching.Memory;
10+
using Microsoft.Extensions.Hosting;
1011
using Microsoft.Extensions.Logging;
1112
using Moq;
1213

@@ -46,14 +47,17 @@ public static (
4647
Mock<IPlayerRepository> repository,
4748
Mock<ILogger<PlayerService>> logger,
4849
Mock<IMemoryCache> memoryCache,
49-
Mock<IMapper> mapper
50-
) InitServiceMocks(object? cacheValue = null)
50+
Mock<IMapper> mapper,
51+
Mock<IHostEnvironment> environment
52+
) InitServiceMocks(object? cacheValue = null, string environmentName = "Development")
5153
{
5254
var repository = new Mock<IPlayerRepository>();
5355
var logger = new Mock<ILogger<PlayerService>>();
5456
var memoryCache = SetupMemoryCacheMock(cacheValue ?? It.IsAny<object>());
5557
var mapper = new Mock<IMapper>();
56-
return (repository, logger, memoryCache, mapper);
58+
var environment = new Mock<IHostEnvironment>();
59+
environment.Setup(env => env.EnvironmentName).Returns(environmentName);
60+
return (repository, logger, memoryCache, mapper, environment);
5761
}
5862

5963
public static Mock<IMemoryCache> SetupMemoryCacheMock(object? value)

0 commit comments

Comments
 (0)