コード
だから私は2つのアセンブリを持っています
「AssemblyWithClassAndModuleInit」にはクラスが含まれています
public class MyBaseClass
{
}
「AssemblyWithInterfaceAndModuleInit」にはインターフェースが含まれています
public interface MyInterface
{
}
どちらにもモジュール初期化子が含まれています
public static class ModuleInitializer
{
public static void Initialize()
{
Environment.SetEnvironmentVariable("ModuleInitializer", "true");
}
}
「AssemblyWithClassAndModuleInit」のテスト (メモMyBaseClass
は のベースとして使用されますClassTests
)
[TestFixture]
public class ClassTests : MyBaseClass
{
[Test]
public void EnsureModuleInitIsCalled()
{
Assert.AreEqual("true", Environment.GetEnvironmentVariable("ModuleInitializer"));
}
[Test]
public void EnsureAssemblyIsLoaded()
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
Assert.IsTrue(assemblies.Any(x => x.GetName().Name == "AssemblyWithClassAndModuleInit"));
}
}
「AssemblyWithInterfaceAndModuleInit」のテスト ( 注MyInterface
は のインターフェースとして使用されますInterfaceTests
)
[TestFixture]
public class InterfaceTests : MyInterface
{
[Test]
public void EnsureModuleInitIsCalled()
{
Assert.AreEqual("true", Environment.GetEnvironmentVariable("ModuleInitializer"));
}
[Test]
public void EnsureAssemblyIsLoaded()
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
Assert.IsTrue(assemblies.Any(x => x.GetName().Name == "AssemblyWithInterfaceAndModuleInit"));
}
}
失敗する唯一のテストはInterfaceTests.EnsureModuleInitIsCalled
.
質問
では、これはなぜですか?InterfaceTests
実装MyInterface
がモジュール初期化子を実行させるという事実はありませんか?
モジュール初期化子を挿入する方法
IL織りを使用しています。具体的にはhttps://github.com/Fody/ModuleInit
これを検知します
public static class ModuleInitializer
{
public static void Initialize()
{
//Init code
}
}
そして、これを追加します
static <Module>()
{
ModuleInitializer.Initialize();
}
アップデート
- 余談ですが、フィールド
Type interfaceType = typeof(MyInterface);
を追加するとInterfaceTests
、すべてのテストに合格します。 - コーディングは .net 4.5 に対して行われました
完全なソース
これは単体テストの再現ですhttps://github.com/SimonCropp/Experiments/tree/master/ModuleInitRepro