我是温莎城堡的菜鸟。我正在构建一个使用 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() );
}
}
当我转到“单元测试 session ”窗口并尝试运行所有测试时,第一个成功,其余的我得到这个堆栈跟踪:
Unable to create instance of class UnitTests.DatabaseTests. Error: Castle.MicroKernel.ComponentRegistrationException: Component RecipeManager.DAL.CategoryRepository could not be registered. There is already a component with that name. Did you want to modify the existing component instead? If not, make sure you specify a unique name.. at Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.Register(IHandler handler) at Castle.MicroKernel.DefaultKernel.AddCustomComponent(ComponentModel model) at Castle.MicroKernel.DefaultKernel.Register(IRegistration[] registrations) at Castle.Windsor.WindsorContainer.Register(IRegistration[] registrations) at RecipeManager.RepositoriesInstaller.Install(IWindsorContainer container, IConfigurationStore store) in C:\Users\Tony\documents\visual studio 2015\Projects\RecipeManager\ManageRecipes\RepositoriesInstaller.cs:line 10 at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers, DefaultComponentInstaller scope) at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers) at UnitTests.TestsInstaller.Install(IWindsorContainer container, IConfigurationStore store) in C:\Users\Tony\documents\visual studio 2015\Projects\RecipeManager\UnitTests\TestsInstaller.cs:line 8 at Castle.Windsor.Installer.AssemblyInstaller.Install(IWindsorContainer container, IConfigurationStore store) at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers, DefaultComponentInstaller scope) at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers) at UnitTests.DatabaseTests..ctor() in C:\Users\Tony\documents\visual studio 2015\Projects\RecipeManager\UnitTests\DatabaseTests.cs:line 17
如果我一次运行一个单元测试,它们都会成功。我打算构建大量测试,所以我真的很希望能够同时运行它们。我该如何解决这个问题?
最佳答案
在您的测试类中,创建一个字段。
private WindsorContainer Container;
(替换现有的静态字段。)
然后,将其添加到您的测试类中:
[TestInitialize]
public void SetUp()
{
Container = new WindsorContainer();
// register your dependencies
}
[TestCleanup]
public void Cleanup()
{
Container.Dispose();
}
[TestInitialize]
在每次测试之前运行,[TestCleanup]
在每次测试之后运行。
这样,您就不会为每个测试重复使用相同的容器,也不会尝试向该容器重新注册相同的依赖项。在运行每个测试之前,您将创建一个新容器。如果每个测试都需要相同的依赖项,您可以在 Setup()
中注册它们。或者,如果需要,您可以在测试方法中注册它们。
关于c# - 在单元测试类中使用 CaSTLe Windsor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36923926/