This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
using Domain;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Db.Tests;
|
||||
|
||||
/// <summary>The domain stayed clean: Client/Order do NOT derive from <see cref="DbBase"/> and expose no <see cref="DbContext"/>-typed member; asserted from the persistence side, where both are visible.</summary>
|
||||
public class DomainStaysPlainTests
|
||||
{
|
||||
private const BindingFlags AllMembers =
|
||||
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
|
||||
|
||||
// The leak is gone: no DbBase in the base chain, no DbContext-typed member (reflection).
|
||||
[Theory]
|
||||
[InlineData(typeof(Client))]
|
||||
[InlineData(typeof(Order))]
|
||||
public void Domain_objects_are_plain__no_DbBase_no_DbContext_member(Type type)
|
||||
{
|
||||
// Not DbBase, and not a derived type either (walk the base chain):
|
||||
for (var t = type; t is not null && t != typeof(object); t = t.BaseType)
|
||||
Assert.NotSame(typeof(DbBase), t);
|
||||
|
||||
// No DbContext-typed member, public or private:
|
||||
foreach (var p in type.GetProperties(AllMembers))
|
||||
Assert.True(p.PropertyType != typeof(DbContext),
|
||||
$"{type.Name}.{p.Name} leaks a DbContext-typed property");
|
||||
foreach (var f in type.GetFields(AllMembers))
|
||||
Assert.True(f.FieldType != typeof(DbContext),
|
||||
$"{type.Name}.{f.Name} leaks a DbContext-typed field");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user