在单元测试课中使用Castle Windsor
我是温莎城堡的小菜。 我正在构建一个使用Entity Framework 6和Castle Windsor的应用程序,并附带MSTest单元测试课程。 我的应用程序中有一个实现IWindsorInstaller
。 我的单元测试类看起来像这样:
[TestClass]
public class DatabaseTests {
static readonly WindsorContainer Container = new WindsorContainer();
public DatabaseTests() {
Container.Install( FromAssembly.This() );
}
[TestMethod]
public void FirstTest() {
// Test statements
}
[TestMethod]
public void SecondTest() {
// Test statements
}
// Other tests
}
单元测试项目中还有一个安装程序类,如下所示:
public class TestsInstaller : IWindsorInstaller {
public void Install( IWindsorContainer container, IConfigurationStore store ) {
container.Install( new RecipeManager.RepositoriesInstaller() );
}
}
当我进入单元测试会话窗口并尝试运行所有测试时,第一个测试成功,剩下的我得到这个堆栈跟踪:
无法创建类UnitTests.DatabaseTests的实例。 错误:Castle.MicroKernel.ComponentRegistrationException:组件RecipeManager.DAL.CategoryRepository无法注册。 已经有一个名称的组件。 你想修改现有的组件吗? 如果没有,请确保您指定一个唯一的名称..在Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.Register(IHandler处理程序)在Castle.MicroKernel.DefaultKernel.AddCustomComponent(ComponentModel模型)在Castle.MicroKernel.DefaultKernel.Register(IRegistration在C: Users Tony documents visual studio 2015 Projects RecipeManager ManageRecipes中的RecipeManager.RepositoriesInstaller.Install(IWindsorContainer容器,IConfigurationStore存储)中的Castle.Windsor.WindsorContainer.Register(IRegistration []注册) RepositoriesInstaller.cs:第10行在Castle.Windsor.WindsorContainer.Install(IWindsorInstaller []安装程序,DefaultComponentInstaller范围)在Castle.Windsor.WindsorContainer.Install(IWindsorInstaller []安装程序)在UnitTests.TestsInstaller.Install(IWindsorContainer容器,IConfigurationStore存储)在C: Users Tony documents visual studio 2015 Projects RecipeManager UnitTests TestsInstaller.cs:Castle.Windsor.Installer.AssemblyIn中的第8行 在UnitTests.DatabaseTests..ctor()的Castle.Windsor.WindsorContainer.Install(IWindsorInstaller []安装程序)中的Castle.Windsor.WindsorContainer.Install(IWindsorInstaller []安装程序,DefaultComponentInstaller作用域)中的staller.Install(IWindsorContainer container,IConfigurationStore store)在C: Users Tony documents visual studio 2015 Projects RecipeManager UnitTests DatabaseTests.cs中:第17行
如果我一次运行一个单元测试,它们都会成功。 我打算建立大量的测试,所以我真的宁愿能够一次运行它们。 我该如何解决?
在你的测试课上,创建一个字段。
private WindsorContainer Container;
(替换现有的静态字段。)
然后,将其添加到您的测试类:
[TestInitialize]
public void SetUp()
{
Container = new WindsorContainer();
// register your dependencies
}
[TestCleanup]
public void Cleanup()
{
Container.Dispose();
}
[TestInitialize]
在每次测试之前运行, [TestCleanup]
在每次测试之后运行。
这样你就不会为每个测试重复使用同一个容器,并试图重新注册与该容器相同的依赖关系。 在每一次测试运行之前,您都将创建一个新的容器。 如果每次测试都需要相同的依赖关系,则可以在Setup()
注册它们。 或者如果需要,您可以在测试方法中注册它们。