在运行所有测试期间测试失败,但是逐个运行它们成功

时间:2014-12-21 15:34:23

标签: c# unit-testing xunit simple-injector

我有4个测试分布在3个测试类中。如果我逐个运行每个测试,他们都可以成功。但是运行所有(并行我认为?)除了第一个被解雇之外它们都会失败?

我的测试需要相同的设置,所以我有一个夹具,所有测试都设置为:

public class CompositionRootFixture
{
    public Container Container { get; private set; } // Simple Injector Container

    public CompositionRootFixture()
    {
        Container = new Container();

        /* code removed for clearity */

        Container.Verify();
    }
}

并在我的测试类中使用,如:

public class CommandProcessorTests : IClassFixture<CompositionRootFixture>
{
    private readonly CompositionRootFixture _fixture;

    public CommandProcessorTests(CompositionRootFixture fixture)
    {
        _fixture = fixture;
    }

    [Fact]
    public async Task TestExecutingUsingContainerForResolution()
    {
        var commands = _fixture.Container.GetInstance<IExecuteCommands>();
        var command = new FakeCommandWithoutValidator();
        await commands.Execute(command);

        Assert.Equal("faked", command.ReturnValue);
    }
}

我很难弄清楚如何使用IClassFixture<T>并且文档在设置时没有多大帮助。我使用的是最新的XUnit 2.0.0-beta5-build2785。

说明失败:

---- System.InvalidOperationException : The configuration is invalid. Creating the instance for type IHandleCommand<FakeCommandWithoutValidator> failed. The registered delegate for type IHandleCommand<FakeCommandWithoutValidator> threw an exception. The configuration is invalid. The type HandleFakeCommandWithoutValidator is directly or indirectly depending on itself.
-------- SimpleInjector.ActivationException : The registered delegate for type IHandleCommand<FakeCommandWithoutValidator> threw an exception. The configuration is invalid. The type HandleFakeCommandWithoutValidator is directly or indirectly depending on itself.
------------ SimpleInjector.ActivationException : The configuration is invalid. The type HandleFakeCommandWithoutValidator is directly or indirectly depending on itself.
---- The following constructor parameters did not have matching fixture data: CompositionRootFixture fixture

4 个答案:

答案 0 :(得分:2)

您的容器正在利用一个单例,它在所有正在执行的测试期间保持状态。

在每次测试前初始化此单例。

答案 1 :(得分:0)

看起来这可能与SimpleInjector中的错误有关:

http://simpleinjector.codeplex.com/discussions/259167

无论如何,问题在于依赖注入。如果该错误没有得到修复,您可以尝试使用Ninject之类的其他IoC容器,至少为了进行比较。

答案 2 :(得分:0)

我通过升级到xUnit 2.0.0并使用新的Collection Fixture修复了这个问题,这在他们的网站上有描述:http://xunit.github.io/docs/shared-context.html

答案 3 :(得分:0)

尽管我没有使用ClassFixture,但我的场景也遇到了相同的问题(某些集成测试针对EventStore运行测试)。

xUnit测试的想法是它可以并行运行每个事实。如果要避免这种情况,可以在某些程序集类中添加以下内容

[assembly: CollectionBehavior(DisableTestParallelization = true)]

它们将顺序运行。

注意: 理想情况下,应该避免这种情况,因为人们对以幂等和无状态的方式设计测试和代码非常感兴趣,实际上我将所有测试都用作该方法的子类,从而拥有一个不错的“当下时”结构:

public abstract class Given_When_Then_Test
    : IDisposable
{
    protected Given_When_Then_Test()
    {
        Setup();
    }

    private void Setup()
    {
        Given();
        When();
    }

    protected abstract void Given();

    protected abstract void When();

    public void Dispose()
    {
        Cleanup();
    }

    protected virtual void Cleanup()
    {
    }
}

我发现的东西:

  1. 当我使用Autofac的IContainer来解析服务而不是先解决IComponentContext然后使用它来解决我的服务时,在并行运行的集成测试中遇到错误。