Skip to content

Commit aa01f4c

Browse files
Dick BakerTasteful
authored andcommitted
make db and mapper fields in base class that are assigned within derived ctor (db also Disposed). cleans up every test Arrange, and removes the tiresome abstract GetX methods, but doesn't need a Fixture. This builds on my earlier Issue #39 and PR (issue #40) which I hope acceptable to package collaborator gurus, but if they _really_ dislike then guess I could redo from latest master freeze.
1 parent 53856d0 commit aa01f4c

4 files changed

Lines changed: 53 additions & 99 deletions

File tree

src/AutoMapper.Collection.EntityFrameworkCore.Tests/EntityFrameworkCoreTestsBase.cs

Lines changed: 26 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Linq;
1+
using System;
2+
using System.Linq;
23
using System.Threading.Tasks;
34
using AutoMapper.EntityFrameworkCore;
45
using FluentAssertions;
@@ -7,18 +8,15 @@
78

89
namespace AutoMapper.Collection.EntityFrameworkCore.Tests
910
{
10-
public abstract class EntityFrameworkCoreTestsBase
11+
public abstract class EntityFramworkCoreTestsBase : IDisposable
1112
{
12-
protected abstract DBContextBase GetDbContext();
13-
protected abstract IMapper GetMapper();
13+
protected IMapper mapper;
14+
protected DBContextBase db; // IDisposable
1415

1516
[Fact]
1617
public void Persist_InsertOrUpdate_WhenEntityExist_ThenTheEntityShouldBeInTheModifiedState()
1718
{
1819
// Arrange
19-
var mapper = GetMapper();
20-
var db = GetDbContext();
21-
2220
db.Things.Add(new Thing { Title = "Test2" });
2321
db.Things.Add(new Thing { Title = "Test3" });
2422
db.Things.Add(new Thing { Title = "Test4" });
@@ -36,10 +34,7 @@ public void Persist_InsertOrUpdate_WhenEntityExist_ThenTheEntityShouldBeInTheMod
3634
[Fact]
3735
public void Persist_InsertOrUpdate_WhenEntityExist_ThenTheEntityShouldBeUpdated()
3836
{
39-
// Arrange
40-
var mapper = GetMapper();
41-
var db = GetDbContext();
42-
37+
// Arrange [mapper and db fields set in ctor]
4338
db.Things.Add(new Thing { Title = "Test2" });
4439
db.Things.Add(new Thing { Title = "Test3" });
4540
db.Things.Add(new Thing { Title = "Test4" });
@@ -59,10 +54,7 @@ public void Persist_InsertOrUpdate_WhenEntityExist_ThenTheEntityShouldBeUpdated(
5954
[Fact]
6055
public void Persist_InsertOrUpdate_WhenEntityDoesNotExist_ThenTheEntityShouldBeInTheAddedState()
6156
{
62-
// Arrange
63-
var mapper = GetMapper();
64-
var db = GetDbContext();
65-
57+
// Arrange [mapper and db fields set in ctor]
6658
db.Things.Add(new Thing { Title = "Test2" });
6759
db.Things.Add(new Thing { Title = "Test3" });
6860
db.Things.Add(new Thing { Title = "Test4" });
@@ -79,10 +71,7 @@ public void Persist_InsertOrUpdate_WhenEntityDoesNotExist_ThenTheEntityShouldBeI
7971
[Fact]
8072
public void Persist_InsertOrUpdate_WhenEntityDoesNotExist_ThenTheEntityShouldBeInserted()
8173
{
82-
// Arrange
83-
var mapper = GetMapper();
84-
var db = GetDbContext();
85-
74+
// Arrange [mapper and db fields set in ctor]
8675
db.Things.Add(new Thing { Title = "Test2" });
8776
db.Things.Add(new Thing { Title = "Test3" });
8877
db.Things.Add(new Thing { Title = "Test4" });
@@ -103,10 +92,7 @@ public void Persist_InsertOrUpdate_WhenEntityDoesNotExist_ThenTheEntityShouldBeI
10392
[Fact]
10493
public async Task Persist_InsertOrUpdateAsync_WhenEntityExist_ThenTheEntityShouldBeInTheModifiedState()
10594
{
106-
// Arrange
107-
var mapper = GetMapper();
108-
var db = GetDbContext();
109-
95+
// Arrange [mapper and db fields set in ctor]
11096
db.Things.Add(new Thing { Title = "Test2" });
11197
db.Things.Add(new Thing { Title = "Test3" });
11298
db.Things.Add(new Thing { Title = "Test4" });
@@ -124,10 +110,7 @@ public async Task Persist_InsertOrUpdateAsync_WhenEntityExist_ThenTheEntityShoul
124110
[Fact]
125111
public async Task Persist_InsertOrUpdateAsync_WhenEntityExist_ThenTheEntityShouldBeUpdated()
126112
{
127-
// Arrange
128-
var mapper = GetMapper();
129-
var db = GetDbContext();
130-
113+
// Arrange [mapper and db fields set in ctor]
131114
db.Things.Add(new Thing { Title = "Test2" });
132115
db.Things.Add(new Thing { Title = "Test3" });
133116
db.Things.Add(new Thing { Title = "Test4" });
@@ -147,10 +130,7 @@ public async Task Persist_InsertOrUpdateAsync_WhenEntityExist_ThenTheEntityShoul
147130
[Fact]
148131
public async Task Persist_InsertOrUpdateAsync_WhenEntityDoesNotExist_ThenTheEntityShouldBeInTheAddedState()
149132
{
150-
// Arrange
151-
var mapper = GetMapper();
152-
var db = GetDbContext();
153-
133+
// Arrange [mapper and db fields set in ctor]
154134
db.Things.Add(new Thing { Title = "Test2" });
155135
db.Things.Add(new Thing { Title = "Test3" });
156136
db.Things.Add(new Thing { Title = "Test4" });
@@ -167,10 +147,7 @@ public async Task Persist_InsertOrUpdateAsync_WhenEntityDoesNotExist_ThenTheEnti
167147
[Fact]
168148
public async Task Persist_InsertOrUpdateAsync_WhenEntityDoesNotExist_ThenTheEntityShouldBeInserted()
169149
{
170-
// Arrange
171-
var mapper = GetMapper();
172-
var db = GetDbContext();
173-
150+
// Arrange [mapper and db fields set in ctor]
174151
db.Things.Add(new Thing { Title = "Test2" });
175152
db.Things.Add(new Thing { Title = "Test3" });
176153
db.Things.Add(new Thing { Title = "Test4" });
@@ -191,10 +168,7 @@ public async Task Persist_InsertOrUpdateAsync_WhenEntityDoesNotExist_ThenTheEnti
191168
[Fact]
192169
public void Persist_Remove_WhenEntityExist_ThenTheEntityShouldBeInTheDeletedState()
193170
{
194-
// Arrange
195-
var mapper = GetMapper();
196-
var db = GetDbContext();
197-
171+
// Arrange [mapper and db fields set in ctor]
198172
db.Things.Add(new Thing { Title = "Test2" });
199173
db.Things.Add(new Thing { Title = "Test3" });
200174
db.Things.Add(new Thing { Title = "Test4" });
@@ -212,10 +186,7 @@ public void Persist_Remove_WhenEntityExist_ThenTheEntityShouldBeInTheDeletedStat
212186
[Fact]
213187
public void Persist_Remove_WhenEntityExist_ThenTheEntityShouldBeDeleted()
214188
{
215-
// Arrange
216-
var mapper = GetMapper();
217-
var db = GetDbContext();
218-
189+
// Arrange [mapper and db fields set in ctor]
219190
db.Things.Add(new Thing { Title = "Test2" });
220191
db.Things.Add(new Thing { Title = "Test3" });
221192
db.Things.Add(new Thing { Title = "Test4" });
@@ -235,10 +206,7 @@ public void Persist_Remove_WhenEntityExist_ThenTheEntityShouldBeDeleted()
235206
[Fact]
236207
public async Task Persist_RemoveAsync_WhenEntityExist_ThenTheEntityShouldBeInTheDeletedState()
237208
{
238-
// Arrange
239-
var mapper = GetMapper();
240-
var db = GetDbContext();
241-
209+
// Arrange [mapper and db fields set in ctor]
242210
db.Things.Add(new Thing { Title = "Test2" });
243211
db.Things.Add(new Thing { Title = "Test3" });
244212
db.Things.Add(new Thing { Title = "Test4" });
@@ -256,10 +224,7 @@ public async Task Persist_RemoveAsync_WhenEntityExist_ThenTheEntityShouldBeInThe
256224
[Fact]
257225
public async Task Persist_RemoveAsync_WhenEntityExist_ThenTheEntityShouldBeDeleted()
258226
{
259-
// Arrange
260-
var mapper = GetMapper();
261-
var db = GetDbContext();
262-
227+
// Arrange [mapper and db fields set in ctor]
263228
db.Things.Add(new Thing { Title = "Test2" });
264229
db.Things.Add(new Thing { Title = "Test3" });
265230
db.Things.Add(new Thing { Title = "Test4" });
@@ -285,10 +250,7 @@ public async Task Persist_RemoveAsync_WhenEntityExist_ThenTheEntityShouldBeDelet
285250
/// <remarks>AutoMapper.Collection.EntityFrameworkCore.Remove silently ignores non-existent DELETEs</remarks>
286251
public void Persist_Remove_WhenEntityDoesNotExist_ThenShouldBeUnchangedState()
287252
{
288-
// Arrange
289-
var mapper = GetMapper();
290-
var db = GetDbContext();
291-
253+
// Arrange [mapper and db fields set in ctor]
292254
db.Things.Add(new Thing { Title = "Test2" });
293255
db.Things.Add(new Thing { Title = "Test3" });
294256
db.Things.Add(new Thing { Title = "Test4" });
@@ -306,10 +268,7 @@ public void Persist_Remove_WhenEntityDoesNotExist_ThenShouldBeUnchangedState()
306268
/// <remarks>AutoMapper.Collection.EntityFrameworkCore.Remove silently ignores non-existent DELETEs</remarks>
307269
public void Persist_Remove_WhenEntityDoesNotExist_ThenShouldBeNoChange()
308270
{
309-
// Arrange
310-
var mapper = GetMapper();
311-
var db = GetDbContext();
312-
271+
// Arrange [mapper and db fields set in ctor]
313272
db.Things.Add(new Thing { Title = "Test2" });
314273
db.Things.Add(new Thing { Title = "Test3" });
315274
db.Things.Add(new Thing { Title = "Test4" });
@@ -333,10 +292,7 @@ public void Persist_Remove_WhenEntityDoesNotExist_ThenShouldBeNoChange()
333292
/// <remarks>this behaviour is like INPC in GUI land</remarks>
334293
public void Persist_InsertOrUpdate_WhenSameEntity_ThenTheEntityShouldBeInTheUnchangedState()
335294
{
336-
// Arrange
337-
var mapper = GetMapper();
338-
var db = GetDbContext();
339-
295+
// Arrange [mapper and db fields set in ctor]
340296
db.Things.Add(new Thing { Title = "Test2" });
341297
db.Things.Add(new Thing { Title = "Test3" });
342298
db.Things.Add(new Thing { Title = "Test4" });
@@ -360,10 +316,7 @@ public void Persist_InsertOrUpdate_WhenSameEntity_ThenTheEntityShouldBeInTheUnch
360316
/// <remarks>this behaviour is like INPC in GUI land</remarks>
361317
public void Persist_InsertOrUpdate_WhenSameEntity_ThenSavedEntityShouldBeSame()
362318
{
363-
// Arrange
364-
var mapper = GetMapper();
365-
var db = GetDbContext();
366-
319+
// Arrange [mapper and db fields set in ctor]
367320
db.Things.Add(new Thing { Title = "Test2" });
368321
db.Things.Add(new Thing { Title = "Test3" });
369322
db.Things.Add(new Thing { Title = "Test4" });
@@ -387,10 +340,7 @@ public void Persist_InsertOrUpdate_WhenSameEntity_ThenSavedEntityShouldBeSame()
387340
/// <remarks>AutoMapper.Collection.EntityFrameworkCore.Remove silently ignores non-existent DELETEs</remarks>
388341
public async Task Persist_RemoveAsync_WhenEntityDoesNotExist_ThenShouldBeUnchangedState()
389342
{
390-
// Arrange
391-
var mapper = GetMapper();
392-
var db = GetDbContext();
393-
343+
// Arrange [mapper and db fields set in ctor]
394344
db.Things.Add(new Thing { Title = "Test2" });
395345
db.Things.Add(new Thing { Title = "Test3" });
396346
db.Things.Add(new Thing { Title = "Test4" });
@@ -408,10 +358,7 @@ public async Task Persist_RemoveAsync_WhenEntityDoesNotExist_ThenShouldBeUnchang
408358
/// <remarks>AutoMapper.Collection.EntityFrameworkCore.Remove silently ignores non-existent DELETEs</remarks>
409359
public async Task Persist_RemoveAsync_WhenEntityDoesNotExist_ThenShouldBeNoChange()
410360
{
411-
// Arrange
412-
var mapper = GetMapper();
413-
var db = GetDbContext();
414-
361+
// Arrange [mapper and db fields set in ctor]
415362
db.Things.Add(new Thing { Title = "Test2" });
416363
db.Things.Add(new Thing { Title = "Test3" });
417364
db.Things.Add(new Thing { Title = "Test4" });
@@ -435,10 +382,7 @@ public async Task Persist_RemoveAsync_WhenEntityDoesNotExist_ThenShouldBeNoChang
435382
/// <remarks>this behaviour is like INPC in GUI land</remarks>
436383
public async Task Persist_InsertOrUpdateAsync_WhenSameEntity_ThenTheEntityShouldBeInTheUnchangedState()
437384
{
438-
// Arrange
439-
var mapper = GetMapper();
440-
var db = GetDbContext();
441-
385+
// Arrange [mapper and db fields set in ctor]
442386
db.Things.Add(new Thing { Title = "Test2" });
443387
db.Things.Add(new Thing { Title = "Test3" });
444388
db.Things.Add(new Thing { Title = "Test4" });
@@ -462,10 +406,7 @@ public async Task Persist_InsertOrUpdateAsync_WhenSameEntity_ThenTheEntityShould
462406
/// <remarks>this behaviour is like INPC in GUI land</remarks>
463407
public async Task Persist_InsertOrUpdateAsync_WhenSameEntity_ThenSavedEntityShouldBeSame()
464408
{
465-
// Arrange
466-
var mapper = GetMapper();
467-
var db = GetDbContext();
468-
409+
// Arrange [mapper and db fields set in ctor]
469410
db.Things.Add(new Thing { Title = "Test2" });
470411
db.Things.Add(new Thing { Title = "Test3" });
471412
db.Things.Add(new Thing { Title = "Test4" });
@@ -484,6 +425,8 @@ public async Task Persist_InsertOrUpdateAsync_WhenSameEntity_ThenSavedEntityShou
484425
db.Things.FirstOrDefault(x => x.ID == item.ID).Title.Should().Be(item.Title);
485426
}
486427

428+
public virtual void Dispose() => db?.Dispose();
429+
487430
public abstract class DBContextBase : DbContext
488431
{
489432
protected DBContextBase(DbContextOptions dbContextOptions)

src/AutoMapper.Collection.EntityFrameworkCore.Tests/EntityFrameworkCoreUsingCtorTests.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace AutoMapper.Collection.EntityFrameworkCore.Tests
66
{
7-
public class EntityFrameworkCoreUsingCtorTests : EntityFrameworkCoreTestsBase
7+
public class EntityFrameworkCoreUsingCtorTests : EntityFramworkCoreTestsBase
88
{
99
private readonly Mapper _mapper;
1010

@@ -16,11 +16,14 @@ public EntityFrameworkCoreUsingCtorTests()
1616
x.CreateMap<ThingDto, Thing>().ReverseMap();
1717
x.UseEntityFrameworkCoreModel<DB>();
1818
}));
19+
20+
mapper = GetMapper(); // needed for every test so pref to place into ctor instead of each Arrange
21+
db = GetDbContext(); // XUnit will create here in ctor and Dispose() after each test
1922
}
2023

21-
protected override DBContextBase GetDbContext() => new DB();
24+
private DBContextBase GetDbContext() => new DB();
2225

23-
protected override IMapper GetMapper() => _mapper;
26+
private IMapper GetMapper() => _mapper;
2427

2528
public class DB : DBContextBase
2629
{

src/AutoMapper.Collection.EntityFrameworkCore.Tests/EntityFrameworkCoreUsingDITests.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55

66
namespace AutoMapper.Collection.EntityFrameworkCore.Tests
77
{
8-
public class EntityFrameworkCoreUsingDITests : EntityFrameworkCoreTestsBase, IDisposable
8+
public class EntityFramworkCoreUsingDITests : EntityFramworkCoreTestsBase //, IDisposable
99
{
1010
private readonly ServiceProvider _serviceProvider;
1111
private readonly Mapper _mapper;
1212
private readonly IServiceScope _serviceScope;
1313

14-
public EntityFrameworkCoreUsingDITests()
14+
public EntityFramworkCoreUsingDITests()
1515
{
1616
var services = new ServiceCollection();
1717

@@ -30,17 +30,21 @@ public EntityFrameworkCoreUsingDITests()
3030
}));
3131

3232
_serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope();
33+
34+
mapper = GetMapper(); // needed for every test so pref to place into ctor instead of each Arrange
35+
db = GetDbContext(); // XUnit will create here in ctor and Dispose() after each test
3336
}
3437

35-
public void Dispose()
38+
public override void Dispose()
3639
{
3740
_serviceScope?.Dispose();
3841
_serviceProvider?.Dispose();
42+
base.Dispose();
3943
}
4044

41-
protected override DBContextBase GetDbContext() => _serviceScope.ServiceProvider.GetRequiredService<DB>();
45+
private DBContextBase GetDbContext() => _serviceScope.ServiceProvider.GetRequiredService<DB>();
4246

43-
protected override IMapper GetMapper() => _mapper;
47+
private IMapper GetMapper() => _mapper;
4448

4549
public class DB : DBContextBase
4650
{

src/AutoMapper.Collection.EntityFrameworkCore.Tests/EntityFrameworkCoreUsingMicrosoftDITests.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace AutoMapper.Collection.EntityFrameworkCore.Tests
88
{
9-
public class EntityFrameworkCoreUsingMicrosoftDITests : EntityFrameworkCoreTestsBase, IDisposable
9+
public class EntityFrameworkCoreUsingMicrosoftDITests : EntityFramworkCoreTestsBase //, IDisposable
1010
{
1111
private readonly ServiceProvider _serviceProvider;
1212
private readonly IServiceScope _serviceScope;
@@ -26,19 +26,23 @@ public EntityFrameworkCoreUsingMicrosoftDITests()
2626
x.CreateMap<ThingDto, Thing>().ReverseMap();
2727
}, new Assembly[0]);
2828

29-
_serviceProvider = services.BuildServiceProvider();
30-
_serviceScope = _serviceProvider.CreateScope();
29+
this._serviceProvider = services.BuildServiceProvider();
30+
this._serviceScope = this._serviceProvider.CreateScope();
31+
32+
mapper = GetMapper(); // needed for every test so pref to place into ctor instead of each Arrange
33+
db = GetDbContext(); // XUnit will create here in ctor and Dispose() after each test
3134
}
3235

33-
public void Dispose()
36+
public override void Dispose()
3437
{
35-
_serviceScope?.Dispose();
36-
_serviceProvider?.Dispose();
38+
this._serviceScope?.Dispose();
39+
this._serviceProvider?.Dispose();
40+
base.Dispose();
3741
}
3842

39-
protected override DBContextBase GetDbContext() => _serviceScope.ServiceProvider.GetRequiredService<DB>();
43+
private DBContextBase GetDbContext() => this._serviceScope.ServiceProvider.GetRequiredService<DB>();
4044

41-
protected override IMapper GetMapper() => _serviceScope.ServiceProvider.GetRequiredService<IMapper>();
45+
private IMapper GetMapper() => this._serviceScope.ServiceProvider.GetRequiredService<IMapper>();
4246

4347
public class DB : DBContextBase
4448
{

0 commit comments

Comments
 (0)