c# - 在单元测试类中使用 CaSTLe Windsor

标签 c# .net unit-testing 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() );
    }
}

当我转到“单元测试 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/

相关文章:

c# - 从 OracleDataAdapter.Fill() 填充 DataTable 时为 "Specified cast is not valid"

.net - 使 .NET 截图工具与多个监视器兼容

c# - Exchange Web 服务 - 获取附件始终为空

unit-testing - 实现测试和单元测试

c# - LightInject GetInstance 返回不能与类型参数一起使用

c# - 作为查询的一部分返回 rownumber()

unit-testing - 声明任意实例时避免构建对 QuickCheck 的依赖

php - 测试 Guzzle 6 下载进度

c# - 为什么抛出异常时finally block 可能不执行?

.net - 如何在 VB.NET 中获取 Caps Lock 的当前状态?