我正在尝试为使用Ninject的项目创建NUnit测试。 Ninject是通过Nuget安装的,因此Configuration类似于这个简化版本:
[assembly: WebActivator.PreApplicationStartMethod(typeof(NinjectMVC3), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(NinjectMVC3), "Stop")]
public static class NinjectMVC3
{
private static readonly Bootstrapper Bootstrapper = new Bootstrapper();
private static IKernel _kernel;
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));
Bootstrapper.Initialize(CreateKernel);
}
public static void Stop()
{
Bootstrapper.ShutDown();
}
}
我希望在我的启动测试类中调用这些方法。我试过了:
[TestFixture]
public class TestBase
{
[SetUp]
public void Setup()
{
NinjectMVC3.Startup();
}
[TearDown]
public void TearDown()
{
NinjectMVC3.TearDown();
}
}
它不起作用,因为我试图手动调用由WebActivator管理的方法。所以我正在寻找一种方法来指示WebActivator在“正确的时间”调用这些方法。让我提醒你,我正在处理两个项目,一个是MVC Web项目(它使用WebActivator for Ninject),另一个是我的MVC Web项目的测试项目。我尝试通过更改Setup方法的实现来调用WebActivator:
[SetUp]
public void Setup()
{
WebActivator.ActivationManager.Run();
}
它不起作用。据我所知,在这个调用下,WebActivator应该做类似的事情:
foreach (var assemblyFile in Directory.GetFiles(HttpRuntime.BinDirectory, "*.dll")) {
var assembly = Assembly.LoadFrom(assemblyFile);
foreach (PreApplicationStartMethodAttribute preStartAttrib in assembly.GetCustomAttributes(
typeof(PreApplicationStartMethodAttribute),
inherit: false)) {
preStartAttrib.InvokeMethod();
}
}
所以我猜它无法找到一个装配体。所以问题是 - 如何命令WebActivator扫描一些额外的程序集并在“正确的时间”激发一些方法。或许我在这里误导,为了测试我的Ninject项目,我应该采取不同的方法?
我可以用WebActivator测试我的解决方案,但由于它最近被广泛使用,我渴望学习如何处理它并强迫它做我想做的事情。
答案 0 :(得分:1)
我会避免在测试项目中使用WebActivator,因为它不能在asp.net之外播放。
如果你想测试你的Ninject内核的设置,那么我会把CreateKernel()方法公之于众,并从你的Setup()方法调用它。
public static IKernel CreateKernel()
...
[SetUp]
public void Setup()
{
NinjectMVC3.CreateKernel();
}
答案 1 :(得分:0)
不幸的是,默认情况下,WebActivator在c:\ tmp ...目录中查找“* .dll”,并且由于它无法找到解决方案中包含的项目库。
我最终确定了源代码,并在ActivationManager类中添加了以下代码:
public static void AddAssembly(Assembly assembly)
{
if (_assemblies == null)
{
_assemblies = new List<Assembly>();
}
_assemblies.Add(assembly);
}
在测试课程中:
private const int PreStartInitStage_DuringPreStartInit = 1;
[SetUp]
public void Setup(){
WebActivator.ActivationManager.AddAssembly(Assembly.GetAssembly(typeof(NinjectMVC3)));
typeof(BuildManager).GetProperty("PreStartInitStage", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, PreStartInitStage_DuringPreStartInit, null);
WebActivator.ActivationManager.RunPreStartMethods();
Kernel = NinjectMVC3.GetKernel();
}
这是一个丑陋的代码,我希望有一天能看到更好的方法。