我有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
答案 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()
{
}
}
我发现的东西:
IContainer
来解析服务而不是先解决IComponentContext
然后使用它来解决我的服务时,在并行运行的集成测试中遇到错误。