Skip to content

Commit d1404a2

Browse files
committed
refactor(tests): more idiomatic Fake methods and result assertions
1 parent d9101db commit d1404a2

File tree

7 files changed

+189
-180
lines changed

7 files changed

+189
-180
lines changed

src/Dotnet.Samples.AspNetCore.WebApi/Data/PlayerData.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Dotnet.Samples.AspNetCore.WebApi.Data;
66

77
public static class PlayerData
88
{
9-
public static List<Player> CreateStarting11()
9+
public static List<Player> MakeStarting11()
1010
{
1111
return
1212
[

src/Dotnet.Samples.AspNetCore.WebApi/Utilities/ApplicationBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public static async Task SeedDbContextAsync(this IApplicationBuilder app)
2121

2222
if (!await dbContext.Players.AnyAsync())
2323
{
24-
await dbContext.Players.AddRangeAsync(PlayerData.CreateStarting11());
24+
await dbContext.Players.AddRangeAsync(PlayerData.MakeStarting11());
2525
await dbContext.SaveChangesAsync();
2626
logger.LogInformation("Successfully seeded database with initial data.");
2727
}

src/Dotnet.Samples.AspNetCore.WebApi/Utilities/DbContextUtils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ CancellationToken cancellationToken
3535
{
3636
if (!await dbContext.Players.AnyAsync(cancellationToken))
3737
{
38-
await dbContext.Players.AddRangeAsync(PlayerData.CreateStarting11(), cancellationToken);
38+
await dbContext.Players.AddRangeAsync(PlayerData.MakeStarting11(), cancellationToken);
3939
await dbContext.SaveChangesAsync(cancellationToken);
4040
}
4141
}

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

Lines changed: 89 additions & 90 deletions
Large diffs are not rendered by default.

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

Lines changed: 39 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@ public PlayerServiceTests()
2525
public async Task GivenCreateAsync_WhenRepositoryAddAsync_ThenAddsPlayerToRepositoryAndRemovesCache()
2626
{
2727
// Arrange
28-
var response = PlayerFakes.CreateResponseModelForOneExistingById(9);
28+
var request = PlayerFakes.MakeRequestModelForCreate();
29+
var response = PlayerFakes.MakeResponseModelForCreate();
2930
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
30-
mapper
31-
.Setup(mapper => mapper.Map<PlayerResponseModel>(It.IsAny<PlayerRequestModel>()))
32-
.Returns(response);
31+
mapper.Setup(mapper => mapper.Map<PlayerResponseModel>(request)).Returns(response);
3332

3433
var service = new PlayerService(
3534
repository.Object,
@@ -39,7 +38,7 @@ public async Task GivenCreateAsync_WhenRepositoryAddAsync_ThenAddsPlayerToReposi
3938
);
4039

4140
// Act
42-
await service.CreateAsync(It.IsAny<PlayerRequestModel>());
41+
await service.CreateAsync(request);
4342

4443
// Assert
4544
repository.Verify(repository => repository.AddAsync(It.IsAny<Player>()), Times.Once);
@@ -59,14 +58,12 @@ public async Task GivenCreateAsync_WhenRepositoryAddAsync_ThenAddsPlayerToReposi
5958
public async Task GivenRetrieveAsync_WhenRepositoryGetAllAsyncReturnsPlayers_ThenCacheCreateEntryAndResultShouldBeListOfPlayers()
6059
{
6160
// Arrange
62-
var players = PlayerFakes.GetStarting11();
63-
var response = PlayerFakes.CreateStarting11ResponseModels();
61+
var value = It.IsAny<object>();
62+
var players = PlayerFakes.MakeStarting11();
63+
var response = PlayerFakes.MakeResponseModelsForRetrieve();
6464
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
6565
repository.Setup(repository => repository.GetAllAsync()).ReturnsAsync(players);
66-
mapper
67-
.Setup(mapper => mapper.Map<List<PlayerResponseModel>>(It.IsAny<List<Player>>()))
68-
.Returns(response);
69-
var value = It.IsAny<object>();
66+
mapper.Setup(mapper => mapper.Map<List<PlayerResponseModel>>(players)).Returns(response);
7067

7168
var service = new PlayerService(
7269
repository.Object,
@@ -94,14 +91,12 @@ public async Task GivenRetrieveAsync_WhenRepositoryGetAllAsyncReturnsPlayers_The
9491
public async Task GivenRetrieveAsync_WhenExecutedForTheSecondTime_ThenSecondExecutionTimeShouldBeLessThanFirst()
9592
{
9693
// Arrange
97-
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
98-
repository
99-
.Setup(repository => repository.GetAllAsync())
100-
.ReturnsAsync(PlayerFakes.GetStarting11());
101-
mapper
102-
.Setup(mapper => mapper.Map<List<PlayerResponseModel>>(It.IsAny<List<Player>>()))
103-
.Returns(PlayerFakes.CreateStarting11ResponseModels());
10494
var value = It.IsAny<object>();
95+
var players = PlayerFakes.MakeStarting11();
96+
var response = PlayerFakes.MakeResponseModelsForRetrieve();
97+
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
98+
repository.Setup(repository => repository.GetAllAsync()).ReturnsAsync(players);
99+
mapper.Setup(mapper => mapper.Map<List<PlayerResponseModel>>(players)).Returns(response);
105100

106101
var service = new PlayerService(
107102
repository.Object,
@@ -133,10 +128,9 @@ public async Task GivenRetrieveAsync_WhenExecutedForTheSecondTime_ThenSecondExec
133128
public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsNull_TheResultShouldBeNull()
134129
{
135130
// Arrange
131+
var id = 999;
136132
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
137-
repository
138-
.Setup(repository => repository.FindByIdAsync(It.IsAny<long>()))
139-
.ReturnsAsync((Player?)null);
133+
repository.Setup(repository => repository.FindByIdAsync(id)).ReturnsAsync(null as Player);
140134

141135
var service = new PlayerService(
142136
repository.Object,
@@ -146,7 +140,7 @@ public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsNull_
146140
);
147141

148142
// Act
149-
var result = await service.RetrieveByIdAsync(It.IsAny<long>());
143+
var result = await service.RetrieveByIdAsync(id);
150144

151145
// Assert
152146
repository.Verify(repository => repository.FindByIdAsync(It.IsAny<long>()), Times.Once);
@@ -159,16 +153,12 @@ public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsNull_
159153
public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_TheResultShouldBePlayer()
160154
{
161155
// Arrange
162-
var id = 9;
163-
var player = PlayerFakes.GetOneExistingById(id);
164-
var response = PlayerFakes.CreateResponseModelForOneExistingById(id);
156+
var id = 1;
157+
var player = PlayerFakes.MakeFromStarting11ById(id);
158+
var response = PlayerFakes.MakeResponseModelForRetrieve(id);
165159
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
166-
repository
167-
.Setup(repository => repository.FindByIdAsync(It.IsAny<long>()))
168-
.ReturnsAsync(player);
169-
mapper
170-
.Setup(mapper => mapper.Map<PlayerResponseModel>(It.IsAny<Player>()))
171-
.Returns(response);
160+
repository.Setup(repository => repository.FindByIdAsync(id)).ReturnsAsync(player);
161+
mapper.Setup(mapper => mapper.Map<PlayerResponseModel>(player)).Returns(response);
172162

173163
var service = new PlayerService(
174164
repository.Object,
@@ -178,7 +168,7 @@ public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsPlaye
178168
);
179169

180170
// Act
181-
var result = await service.RetrieveByIdAsync(It.IsAny<long>());
171+
var result = await service.RetrieveByIdAsync(id);
182172

183173
// Assert
184174
repository.Verify(repository => repository.FindByIdAsync(It.IsAny<long>()), Times.Once);
@@ -192,10 +182,11 @@ public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsPlaye
192182
public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumberAsyncReturnsNull_ThenResultShouldBeNull()
193183
{
194184
// Arrange
185+
var squadNumber = 999;
195186
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
196187
repository
197-
.Setup(repository => repository.FindBySquadNumberAsync(It.IsAny<int>()))
198-
.ReturnsAsync((Player?)null);
188+
.Setup(repository => repository.FindBySquadNumberAsync(squadNumber))
189+
.ReturnsAsync(null as Player);
199190

200191
var service = new PlayerService(
201192
repository.Object,
@@ -205,7 +196,7 @@ public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumbe
205196
);
206197

207198
// Act
208-
var result = await service.RetrieveBySquadNumberAsync(It.IsAny<int>());
199+
var result = await service.RetrieveBySquadNumberAsync(squadNumber);
209200

210201
// Assert
211202
repository.Verify(
@@ -221,16 +212,15 @@ public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumbe
221212
public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumberAsyncReturnsPlayer_ThenResultShouldBePlayer()
222213
{
223214
// Arrange
224-
var id = 9;
225-
var player = PlayerFakes.GetOneExistingById(id);
226-
var response = PlayerFakes.CreateResponseModelForOneExistingById(id);
215+
var id = 1;
216+
var player = PlayerFakes.MakeFromStarting11ById(id);
217+
var squadNumber = player.SquadNumber;
218+
var response = PlayerFakes.MakeResponseModelForRetrieve(id);
227219
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
228220
repository
229-
.Setup(repository => repository.FindBySquadNumberAsync(It.IsAny<int>()))
221+
.Setup(repository => repository.FindBySquadNumberAsync(squadNumber))
230222
.ReturnsAsync(player);
231-
mapper
232-
.Setup(mapper => mapper.Map<PlayerResponseModel>(It.IsAny<Player>()))
233-
.Returns(response);
223+
mapper.Setup(mapper => mapper.Map<PlayerResponseModel>(player)).Returns(response);
234224

235225
var service = new PlayerService(
236226
repository.Object,
@@ -240,7 +230,7 @@ public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumbe
240230
);
241231

242232
// Act
243-
var result = await service.RetrieveBySquadNumberAsync(It.IsAny<int>());
233+
var result = await service.RetrieveBySquadNumberAsync(squadNumber);
244234

245235
// Assert
246236
repository.Verify(
@@ -261,13 +251,11 @@ public async Task GivenRetrieveBySquadNumberAsync_WhenRepositoryFindBySquadNumbe
261251
public async Task GivenUpdateAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_ThenRepositoryUpdateAsyncAndCacheRemove()
262252
{
263253
// Arrange
264-
var id = 9;
265-
var player = PlayerFakes.GetOneExistingById(id);
266-
var request = PlayerFakes.CreateRequestModelForOneExistingById(id);
254+
var id = 1;
255+
var player = PlayerFakes.MakeFromStarting11ById(id);
256+
var request = PlayerFakes.MakeRequestModelForUpdate(id);
267257
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
268-
repository
269-
.Setup(repository => repository.FindByIdAsync(It.IsAny<long>()))
270-
.ReturnsAsync(player);
258+
repository.Setup(repository => repository.FindByIdAsync(id)).ReturnsAsync(player);
271259

272260
var service = new PlayerService(
273261
repository.Object,
@@ -298,8 +286,8 @@ public async Task GivenUpdateAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_Then
298286
public async Task GivenDeleteAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_ThenRepositoryDeleteAsyncAndCacheRemove()
299287
{
300288
// Arrange
301-
var id = 9;
302-
var player = PlayerFakes.GetOneExistingById(id);
289+
var id = 2;
290+
var player = PlayerFakes.MakeFromStarting11ById(id);
303291
var (repository, logger, memoryCache, mapper) = PlayerMocks.InitServiceMocks();
304292
repository
305293
.Setup(repository => repository.FindByIdAsync(It.IsAny<long>()))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ CREATE TABLE players (
4848

4949
public static void Seed(this PlayerDbContext context)
5050
{
51-
context.Players.AddRange(PlayerFakes.GetStarting11());
51+
context.Players.AddRange(PlayerFakes.MakeStarting11());
5252
context.SaveChanges();
5353
}
5454
}

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

Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace Dotnet.Samples.AspNetCore.WebApi.Tests.Utilities;
1212
/// </summary>
1313
public static class PlayerFakes
1414
{
15-
public static List<Player> GetStarting11()
15+
public static List<Player> MakeStarting11()
1616
{
1717
return
1818
[
@@ -170,24 +170,16 @@ public static List<Player> GetStarting11()
170170
];
171171
}
172172

173-
public static List<PlayerResponseModel> CreateStarting11ResponseModels() =>
174-
[
175-
.. GetStarting11()
176-
.Select(player => new PlayerResponseModel
177-
{
178-
Id = player.Id,
179-
FullName =
180-
$"{player.FirstName} {(string.IsNullOrWhiteSpace(player.MiddleName) ? "" : player.MiddleName + " ")}{player.LastName}".Trim(),
181-
Birth = $"{player.DateOfBirth:MMMM d, yyyy}",
182-
Dorsal = player.SquadNumber,
183-
Position = player.Position,
184-
Club = player.Team,
185-
League = player.League,
186-
Starting11 = player.Starting11 ? "Yes" : "No"
187-
})
188-
];
173+
public static Player MakeFromStarting11ById(long id)
174+
{
175+
var player =
176+
MakeStarting11().SingleOrDefault(player => player.Id == id)
177+
?? throw new ArgumentNullException($"Player with ID {id} not found.");
178+
179+
return player;
180+
}
189181

190-
public static Player CreateOneNew()
182+
public static Player MakeNew()
191183
{
192184
return new()
193185
{
@@ -205,11 +197,15 @@ public static Player CreateOneNew()
205197
};
206198
}
207199

208-
public static PlayerRequestModel CreateRequestModelForOneNew()
200+
/* -------------------------------------------------------------------------
201+
* Create
202+
* ---------------------------------------------------------------------- */
203+
204+
public static PlayerRequestModel MakeRequestModelForCreate()
209205
{
210-
var player = CreateOneNew();
206+
var player = MakeNew();
211207

212-
return new()
208+
return new PlayerRequestModel()
213209
{
214210
Id = player.Id,
215211
FirstName = player.FirstName,
@@ -223,9 +219,9 @@ public static PlayerRequestModel CreateRequestModelForOneNew()
223219
};
224220
}
225221

226-
public static PlayerResponseModel CreateResponseModelForOneNew()
222+
public static PlayerResponseModel MakeResponseModelForCreate()
227223
{
228-
var player = CreateOneNew();
224+
var player = MakeNew();
229225

230226
return new PlayerResponseModel
231227
{
@@ -241,19 +237,14 @@ public static PlayerResponseModel CreateResponseModelForOneNew()
241237
};
242238
}
243239

244-
public static Player GetOneExistingById(long id)
245-
{
246-
var player =
247-
GetStarting11().SingleOrDefault(player => player.Id == id)
248-
?? throw new ArgumentNullException($"Player with ID {id} not found.");
249-
250-
return player;
251-
}
240+
/* -------------------------------------------------------------------------
241+
* Retrieve
242+
* ---------------------------------------------------------------------- */
252243

253-
public static PlayerRequestModel CreateRequestModelForOneExistingById(long id)
244+
public static PlayerRequestModel MakeRequestModelForRetrieve(long id)
254245
{
255246
var player =
256-
GetStarting11().SingleOrDefault(player => player.Id == id)
247+
MakeStarting11().SingleOrDefault(player => player.Id == id)
257248
?? throw new ArgumentNullException($"Player with ID {id} not found.");
258249

259250
return new PlayerRequestModel
@@ -270,10 +261,10 @@ public static PlayerRequestModel CreateRequestModelForOneExistingById(long id)
270261
};
271262
}
272263

273-
public static PlayerResponseModel CreateResponseModelForOneExistingById(long id)
264+
public static PlayerResponseModel MakeResponseModelForRetrieve(long id)
274265
{
275266
var player =
276-
GetStarting11().SingleOrDefault(player => player.Id == id)
267+
MakeStarting11().SingleOrDefault(player => player.Id == id)
277268
?? throw new ArgumentNullException($"Player with ID {id} not found.");
278269

279270
return new PlayerResponseModel
@@ -289,4 +280,35 @@ public static PlayerResponseModel CreateResponseModelForOneExistingById(long id)
289280
Starting11 = player.Starting11 ? "Yes" : "No"
290281
};
291282
}
283+
284+
public static List<PlayerResponseModel> MakeResponseModelsForRetrieve() =>
285+
[
286+
.. MakeStarting11()
287+
.Select(player => new PlayerResponseModel
288+
{
289+
Id = player.Id,
290+
FullName =
291+
$"{player.FirstName} {(string.IsNullOrWhiteSpace(player.MiddleName) ? "" : player.MiddleName + " ")}{player.LastName}".Trim(),
292+
Birth = $"{player.DateOfBirth:MMMM d, yyyy}",
293+
Dorsal = player.SquadNumber,
294+
Position = player.Position,
295+
Club = player.Team,
296+
League = player.League,
297+
Starting11 = player.Starting11 ? "Yes" : "No"
298+
})
299+
];
300+
301+
/* -------------------------------------------------------------------------
302+
* Update
303+
* ---------------------------------------------------------------------- */
304+
305+
public static PlayerRequestModel MakeRequestModelForUpdate(long id)
306+
{
307+
return MakeRequestModelForRetrieve(id);
308+
}
309+
310+
public static PlayerResponseModel MakeResponseModelForUpdate(long id)
311+
{
312+
return MakeResponseModelForRetrieve(id);
313+
}
292314
}

0 commit comments

Comments
 (0)