在单元测试类中使用 Castle Windsor

Ton*_*ile 1 .net c# unit-testing castle-windsor

我是温莎城堡的菜鸟。我正在构建一个使用实体框架 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
}
Run Code Online (Sandbox Code Playgroud)

单元测试项目中还有一个安装程序类,如下所示:

public class TestsInstaller : IWindsorInstaller {
    public void Install( IWindsorContainer container, IConfigurationStore store ) {
        container.Install( new RecipeManager.RepositoriesInstaller() );
    }
}
Run Code Online (Sandbox Code Playgroud)

当我转到“单元测试会话”窗口并尝试运行所有测试时,第一个测试成功,其余的我得到此堆栈跟踪:

无法创建类 UnitTests.DatabaseTests 的实例。错误:Castle.MicroKernel.ComponentRegistrationException:无法注册组件 RecipeManager.DAL.CategoryRepository。已经有一个具有该名称的组件。您想改为修改现有组件吗?如果没有,请确保在 Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.Register(IHandler handler) at Castle.MicroKernel.DefaultKernel.AddCustomComponent(ComponentModel model) at Castle.MicroKernel.DefaultKernel.Register(IRegistration) 中指定唯一名称.. [] 注册) 在 Castle.Windsor.WindsorContainer.Register(IRegistration[] 注册) 在 RecipeManager.RepositoriesInstaller.Install(IWindsorContainer container, IConfigurationStore store) 在 C:

如果我一次运行一个单元测试,它们都会成功。我打算构建大量测试,所以我真的希望能够一次运行它们。我该如何解决?

Sco*_*nen 5

在您的测试类中,创建一个字段。

private WindsorContainer Container;
Run Code Online (Sandbox Code Playgroud)

(替换现有的静态字段。)

然后,将其添加到您的测试类中:

[TestInitialize]
public void SetUp()
{
    Container = new WindsorContainer();
    // register your dependencies
}

[TestCleanup]
public void Cleanup()
{
    Container.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

[TestInitialize][TestCleanup]在每次测试之前运行,在每次测试之后运行。
这样,您就不会为每个测试重用相同的容器,也不会尝试向该容器重新注册相同的依赖项。在运行每个测试之前,您将创建一个新容器。如果每个测试都需要相同的依赖项,可以在Setup(). 或者,如果需要,您可以在测试方法中注册它们。