Skip to content

Commit

Permalink
Mock non-generic IEnumerable + update NuGet packages
Browse files Browse the repository at this point in the history
  • Loading branch information
huysentruitw committed Oct 18, 2018
1 parent 3d64239 commit 307557b
Show file tree
Hide file tree
Showing 11 changed files with 120 additions and 30 deletions.
4 changes: 2 additions & 2 deletions EntityFrameworkMock.sln
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EntityFrameworkMock.Shared.
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NSubstitute", "NSubstitute", "{6320D96B-E5E7-4183-964E-3A9CC7BAD043}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EntityFrameworkMock.NSubstitute.Tests", "tests\EntityFrameworkMock.NSubstitute.Tests\EntityFrameworkMock.NSubstitute.Tests.csproj", "{8E8FB4F1-578A-4DC2-B113-97B87C0E3501}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EntityFrameworkMock.NSubstitute.Tests", "tests\EntityFrameworkMock.NSubstitute.Tests\EntityFrameworkMock.NSubstitute.Tests.csproj", "{8E8FB4F1-578A-4DC2-B113-97B87C0E3501}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EntityFrameworkMock.NSubstitute", "src\EntityFrameworkMock.NSubstitute\EntityFrameworkMock.NSubstitute.csproj", "{2C669CD3-5428-48EE-A809-53E5B7E4E5A6}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EntityFrameworkMock.NSubstitute", "src\EntityFrameworkMock.NSubstitute\EntityFrameworkMock.NSubstitute.csproj", "{2C669CD3-5428-48EE-A809-53E5B7E4E5A6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down
11 changes: 9 additions & 2 deletions src/EntityFrameworkMock.Moq/DbSetMock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
Expand All @@ -36,8 +37,14 @@ public DbSetMock(IEnumerable<TEntity> initialEntities, Func<TEntity, KeyContext,
As<IQueryable<TEntity>>().Setup(x => x.Provider).Returns(asyncQuerySupport ? new DbAsyncQueryProvider<TEntity>(data.Provider) : data.Provider);
As<IQueryable<TEntity>>().Setup(x => x.Expression).Returns(data.Expression);
As<IQueryable<TEntity>>().Setup(x => x.ElementType).Returns(data.ElementType);
As<IQueryable<TEntity>>().Setup(x => x.GetEnumerator()).Returns(() => _store.GetDataEnumerator());
if (asyncQuerySupport) As<IDbAsyncEnumerable<TEntity>>().Setup(x => x.GetAsyncEnumerator()).Returns(() => new DbAsyncEnumerator<TEntity>(_store.GetDataEnumerator()));
As<IQueryable<TEntity>>().Setup(x => x.GetEnumerator()).Returns(() => data.GetEnumerator());
As<IEnumerable>().Setup(x => x.GetEnumerator()).Returns(() => data.GetEnumerator());

if (asyncQuerySupport)
{
As<IDbAsyncEnumerable<TEntity>>().Setup(x => x.GetAsyncEnumerator()).Returns(() => new DbAsyncEnumerator<TEntity>(data.GetEnumerator()));
}

Setup(x => x.AsNoTracking()).Returns(() => Object);
Setup(x => x.Include(It.IsAny<string>())).Returns(() => Object);

Expand Down
4 changes: 2 additions & 2 deletions src/EntityFrameworkMock.Moq/EntityFrameworkMock.Moq.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Castle.Core" Version="4.2.1" />
<PackageReference Include="Castle.Core" Version="4.3.1" />
<PackageReference Include="EntityFramework" Version="6.2.0" />
<PackageReference Include="Moq" Version="4.7.145" />
<PackageReference Include="Moq" Version="4.10.0" />
</ItemGroup>

<ItemGroup>
Expand Down
19 changes: 8 additions & 11 deletions src/EntityFrameworkMock.NSubstitute/DbSetMock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
Expand All @@ -35,32 +36,28 @@ public DbSetMock(IEnumerable<TEntity> initialEntities, Func<TEntity, KeyContext,
_store = new DbSetBackingStore<TEntity>(initialEntities, keyFactory);

var data = _store.GetDataAsQueryable();

Func<DbAsyncEnumerable<TEntity>> getQuery =
() => new DbAsyncEnumerable<TEntity>(data.AsQueryable());

DbSet = Substitute.For<DbSet<TEntity>, IQueryable<TEntity>, IDbAsyncEnumerable<TEntity>>();

((IQueryable<TEntity>)DbSet).Provider.Returns(asyncQuerySupport ? new DbAsyncQueryProvider<TEntity>(data.Provider) : data.Provider);
DbSet.AsQueryable().Provider.Returns(asyncQuerySupport ? new DbAsyncQueryProvider<TEntity>(data.Provider) : data.Provider);
DbSet.AsQueryable().Expression.Returns(data.Expression);
DbSet.AsQueryable().ElementType.Returns(data.ElementType);
((IQueryable<TEntity>)DbSet).GetEnumerator().Returns(a => _store.GetDataEnumerator());
((IQueryable<TEntity>)DbSet).GetEnumerator().Returns(_ => data.GetEnumerator());
((IEnumerable)DbSet).GetEnumerator().Returns(_ => data.GetEnumerator());

if (asyncQuerySupport)
{
((IDbAsyncEnumerable<TEntity>)DbSet).GetAsyncEnumerator()
.Returns(a => getQuery().GetAsyncEnumerator());
((IDbAsyncEnumerable<TEntity>)DbSet).GetAsyncEnumerator().Returns(_ => new DbAsyncEnumerator<TEntity>(data.GetEnumerator()));
}

DbSet.AsNoTracking().Returns(DbSet);
DbSet.Include(Arg.Any<string>()).Returns(DbSet);
DbSet.AsNoTracking().Include(Arg.Any<string>()).Returns(DbSet);

DbSet.When(a => a.Add(Arg.Any<TEntity>())).Do(b => _store.Add(b.ArgAt<TEntity>(0)));
DbSet.When(a => a.AddRange(Arg.Any<IEnumerable<TEntity>>())).Do(b => _store.Add(b.ArgAt<IEnumerable<TEntity>>(0)));
DbSet.When(a => a.Remove(Arg.Any<TEntity>())).Do(b => _store.Remove(b.ArgAt<TEntity>(0)));
DbSet.When(a => a.RemoveRange(Arg.Any<IEnumerable<TEntity>>())).Do(b => _store.Remove(b.ArgAt<IEnumerable<TEntity>>(0)));
DbSet.When(a => a.Add(Arg.Any<TEntity>())).Do(x => _store.Add(x.ArgAt<TEntity>(0)));
DbSet.When(a => a.AddRange(Arg.Any<IEnumerable<TEntity>>())).Do(x => _store.Add(x.ArgAt<IEnumerable<TEntity>>(0)));
DbSet.When(a => a.Remove(Arg.Any<TEntity>())).Do(x => _store.Remove(x.ArgAt<TEntity>(0)));
DbSet.When(a => a.RemoveRange(Arg.Any<IEnumerable<TEntity>>())).Do(x => _store.Remove(x.ArgAt<IEnumerable<TEntity>>(0)));

_store.UpdateSnapshot();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Castle.Core" Version="4.2.1" />
<PackageReference Include="Castle.Core" Version="4.3.1" />
<PackageReference Include="EntityFramework" Version="6.2.0" />
<PackageReference Include="NSubstitute" Version="3.1.0" />
</ItemGroup>
Expand Down
2 changes: 0 additions & 2 deletions src/EntityFrameworkMock.Shared/DbSetBackingStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,6 @@ public DbSetBackingStore(IEnumerable<TEntity> initialEntities, Func<TEntity, Key

public IQueryable<TEntity> GetDataAsQueryable() => _entities.Values.AsQueryable();

public IEnumerator<TEntity> GetDataEnumerator() => _entities.Values.GetEnumerator();

/// <summary>
/// Registers the addition of a new entity.
/// </summary>
Expand Down
53 changes: 49 additions & 4 deletions tests/EntityFrameworkMock.Moq.Tests/DbSetMockTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
Expand Down Expand Up @@ -77,6 +79,27 @@ public void DbSetMock_GivenEntityIsRemoved_ShouldRemoveAfterCallingSaveChanges()
Assert.That(dbSet.Any(x => x.Id == user.Id && x.FullName == user.FullName), Is.False);
}

[Test]
public void DbSetMock_GivenRangeOfEntitiesIsRemoved_ShouldRemoveAfterCallingSaveChanges()
{
var users = new[]
{
new User {Id = Guid.NewGuid(), FullName = "User 1"},
new User {Id = Guid.NewGuid(), FullName = "User 2"},
new User {Id = Guid.NewGuid(), FullName = "User 3"}
};
var dbSetMock = new DbSetMock<User>(users, (x, _) => x.Id);
var dbSet = dbSetMock.Object;

Assert.That(dbSet.Count(), Is.EqualTo(3));
dbSet.RemoveRange(users.Skip(1));
Assert.That(dbSet.Count(), Is.EqualTo(3));
((IDbSetMock)dbSetMock).SaveChanges();
Assert.That(dbSet.Count(), Is.EqualTo(1));
Assert.That(dbSet.Any(x => x.FullName == "User 1"), Is.True);
Assert.That(dbSet.Any(x => x.FullName == "User 2"), Is.False);
}

[Test]
public void DbSetMock_SaveChanges_GivenEntityPropertyIsChanged_ShouldFireSavedChangesEventWithCorrectUpdatedInfo()
{
Expand Down Expand Up @@ -112,9 +135,9 @@ public void DbSetMock_SaveChanges_GivenEntityPropertyMarkedAsNotMapped_ShouldNot
{
var dbSetMock = new DbSetMock<NestedModel>(new[]
{
new NestedModel {Id = Guid.NewGuid(), NesteDocument = new NestedModel.Document()},
new NestedModel {Id = Guid.NewGuid(), NesteDocument = new NestedModel.Document()},
new NestedModel {Id = Guid.NewGuid(), NesteDocument = new NestedModel.Document()}
new NestedModel {Id = Guid.NewGuid(), NestedDocument = new NestedModel.Document()},
new NestedModel {Id = Guid.NewGuid(), NestedDocument = new NestedModel.Document()},
new NestedModel {Id = Guid.NewGuid(), NestedDocument = new NestedModel.Document()}
}, (x, _) => x.Id);

SavedChangesEventArgs<NestedModel> eventArgs = null;
Expand All @@ -133,14 +156,36 @@ public void DbSetMock_SaveChanges_GivenEntityPropertyMarkedAsNotMapped_ShouldNot
Assert.That(updatedProperty.New, Is.EqualTo("abc"));
}

[Test]
public void DbSetMock_Empty_AsEnumerable_ShouldReturnEmptyEnumerable()
{
var dbSetMock = new DbSetMock<NestedModel>(new List<NestedModel>(), (x, _) => x.Id);
var nestedModels = dbSetMock.Object.AsEnumerable();
Assert.That(nestedModels, Is.Not.Null);
Assert.That(nestedModels, Is.Empty);
}

[Test]
public void DbSetMock_AsEnumerable_ShouldReturnEnumerableCollection()
{
var dbSetMock = new DbSetMock<NestedModel>(new[]
{
new NestedModel {Id = Guid.NewGuid(), NestedDocument = new NestedModel.Document()},
new NestedModel {Id = Guid.NewGuid(), NestedDocument = new NestedModel.Document()}
}, (x, _) => x.Id);
var nestedModels = dbSetMock.Object.AsEnumerable();
Assert.That(nestedModels, Is.Not.Null);
Assert.That(nestedModels.Count(), Is.EqualTo(2));
}

public class NestedModel
{
public Guid Id { get; set; }

public string Value { get; set; }

[NotMapped]
public Document NesteDocument
public Document NestedDocument
{
get { return new Document { Name = Guid.NewGuid().ToString("N") }; }
// ReSharper disable once ValueParameterNotUsed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Castle.Core" Version="4.2.1" />
<PackageReference Include="Castle.Core" Version="4.3.1" />
<PackageReference Include="EntityFramework" Version="6.2.0" />
<PackageReference Include="Moq" Version="4.7.145" />
<PackageReference Include="NUnit" Version="3.10.1" />
<PackageReference Include="Moq" Version="4.10.0" />
<PackageReference Include="NUnit" Version="3.11.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />
</ItemGroup>

Expand Down
43 changes: 43 additions & 0 deletions tests/EntityFrameworkMock.NSubstitute.Tests/DbSetMockTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,27 @@ public void DbSetMock_GivenEntityIsRemoved_ShouldRemoveAfterCallingSaveChanges()
Assert.That(dbSet.Any(x => x.Id == user.Id && x.FullName == user.FullName), Is.False);
}

[Test]
public void DbSetMock_GivenRangeOfEntitiesIsRemoved_ShouldRemoveAfterCallingSaveChanges()
{
var users = new[]
{
new User {Id = Guid.NewGuid(), FullName = "User 1"},
new User {Id = Guid.NewGuid(), FullName = "User 2"},
new User {Id = Guid.NewGuid(), FullName = "User 3"}
};
var dbSetMock = new DbSetMock<User>(users, (x, _) => x.Id);
var dbSet = dbSetMock.DbSet;

Assert.That(dbSet.Count(), Is.EqualTo(3));
dbSet.RemoveRange(users.Skip(1));
Assert.That(dbSet.Count(), Is.EqualTo(3));
((IDbSetMock)dbSetMock).SaveChanges();
Assert.That(dbSet.Count(), Is.EqualTo(1));
Assert.That(dbSet.Any(x => x.FullName == "User 1"), Is.True);
Assert.That(dbSet.Any(x => x.FullName == "User 2"), Is.False);
}

[Test]
public void DbSetMock_SaveChanges_GivenEntityPropertyIsChanged_ShouldFireSavedChangesEventWithCorrectUpdatedInfo()
{
Expand Down Expand Up @@ -161,6 +182,28 @@ public void DbSetMock_SaveChanges_GivenEntityPropertyMarkedAsNotMapped_ShouldNot
Assert.That(updatedProperty.New, Is.EqualTo("abc"));
}

[Test]
public void DbSetMock_Empty_AsEnumerable_ShouldReturnEmptyEnumerable()
{
var dbSetMock = new DbSetMock<NestedModel>(new List<NestedModel>(), (x, _) => x.Id);
var nestedModels = dbSetMock.DbSet.AsEnumerable();
Assert.That(nestedModels, Is.Not.Null);
Assert.That(nestedModels, Is.Empty);
}

[Test]
public void DbSetMock_AsEnumerable_ShouldReturnEnumerableCollection()
{
var dbSetMock = new DbSetMock<NestedModel>(new[]
{
new NestedModel {Id = Guid.NewGuid(), NestedDocument = new NestedModel.Document()},
new NestedModel {Id = Guid.NewGuid(), NestedDocument = new NestedModel.Document()}
}, (x, _) => x.Id);
var nestedModels = dbSetMock.DbSet.AsEnumerable();
Assert.That(nestedModels, Is.Not.Null);
Assert.That(nestedModels.Count(), Is.EqualTo(2));
}

public class NestedModel
{
public Guid Id { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Castle.Core" Version="4.2.1" />
<PackageReference Include="Castle.Core" Version="4.3.1" />
<PackageReference Include="EntityFramework" Version="6.2.0" />
<PackageReference Include="NSubstitute" Version="3.1.0" />
<PackageReference Include="NUnit" Version="3.10.1" />
<PackageReference Include="NUnit" Version="3.11.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

<ItemGroup>
<PackageReference Include="AutoFixture" Version="4.5.0" />
<PackageReference Include="NUnit" Version="3.10.1" />
<PackageReference Include="NUnit" Version="3.11.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />
</ItemGroup>

Expand Down

0 comments on commit 307557b

Please sign in to comment.