/
TestBase.cs
84 lines (73 loc) · 2.81 KB
/
TestBase.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
using MongoFramework.Infrastructure.Mapping;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Reflection;
namespace MongoFramework.Tests
{
[TestClass]
public abstract class TestBase
{
protected static void ResetMongoDb()
{
ResetMongoDbDriver();
EntityMapping.RemoveAllDefinitions();
EntityMapping.RemoveAllMappingProcessors();
EntityMapping.AddMappingProcessors(DefaultMappingPack.Instance.Processors);
}
private static void ResetMongoDbDriver()
{
//Primarily introduced to better test TypeDiscoverySerializer, this is designed to reset the MongoDB driver
//as if the assembly just loaded. It is likely incomplete and would be easily subject to breaking in future
//driver updates. If someone knows a better way to reset the MongoDB driver, please open a pull request!
var classMapField = typeof(BsonClassMap).GetField("__classMaps", BindingFlags.NonPublic | BindingFlags.Static);
if (classMapField.GetValue(null) is Dictionary<Type, BsonClassMap> classMaps)
{
classMaps.Clear();
}
var knownTypesField = typeof(BsonSerializer).GetField("__typesWithRegisteredKnownTypes", BindingFlags.NonPublic | BindingFlags.Static);
if (knownTypesField.GetValue(null) is HashSet<Type> knownTypes)
{
knownTypes.Clear();
}
var discriminatorTypesField = typeof(BsonSerializer).GetField("__discriminatedTypes", BindingFlags.NonPublic | BindingFlags.Static);
if (discriminatorTypesField.GetValue(null) is HashSet<Type> discriminatorTypes)
{
discriminatorTypes.Clear();
}
var discriminatorsField = typeof(BsonSerializer).GetField("__discriminators", BindingFlags.NonPublic | BindingFlags.Static);
if (discriminatorsField.GetValue(null) is Dictionary<BsonValue, HashSet<Type>> discriminators)
{
discriminators.Clear();
}
var serializerRegistryField = typeof(BsonSerializer).GetField("__serializerRegistry", BindingFlags.NonPublic | BindingFlags.Static);
if (serializerRegistryField.GetValue(null) is BsonSerializerRegistry registry)
{
var cacheField = typeof(BsonSerializerRegistry).GetField("_cache", BindingFlags.NonPublic | BindingFlags.Instance);
var registryCache = cacheField.GetValue(registry) as ConcurrentDictionary<Type, IBsonSerializer>;
registryCache.Clear();
}
}
protected static void ClearDatabase()
{
//Removing the database created for the tests
var client = new MongoClient(TestConfiguration.ConnectionString);
client.DropDatabase(TestConfiguration.GetDatabaseName());
}
[TestInitialize]
public void Initialise()
{
ResetMongoDb();
ClearDatabase();
}
[AssemblyCleanup]
public static void AssemblyCleanup()
{
ClearDatabase();
}
}
}