收集夹具不会注入
Collection fixture won't inject
我正在使用 xUnit 2.0 collection fixtures 在多个不同的测试 class 之间共享一个公共数据库 setup/teardown。 fixture 还提供了一些辅助属性,所以我将它注入到每个测试中 class.
我在文档中重新创建了示例,但是当我 运行 测试时,它立即失败并显示:
The following constructor parameters did not have matching fixture data: IntegrationTestFixture fixture
无论我使用的是 xUnit Facts 还是 Theories,或者我使用的是哪种测试 运行ner,这似乎都会发生。
夹具:
public class IntegrationTestFixture : IDisposable
{
public IntegrationTestFixture()
{
// (setup code)
this.GeneratedTestName = [randomly generated];
}
public void Dispose()
{
// (teardown code)
}
public string GeneratedTestName { get; private set; }
}
集合定义:
[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
测试:
[CollectionDefinition("Live tests")]
public class SomeTests
{
private readonly IntegrationTestFixture fixture;
public SomeTests(IntegrationTestFixture fixture)
{
this.fixture = fixture;
}
[Fact]
public void MyTestMethod()
{
// ... test here
}
}
这是一个愚蠢的错误,我花了一些时间才弄清楚为什么它不起作用:
[CollectionDefinition]
继续集合定义 class,但 [Collection]
继续测试 class。我当时处于自动驾驶状态,没有注意到这一点。
如果您在不同的 class 上有 多个 [CollectionDefinition]
具有相同名称的属性,您也会得到这个。就用一个吧!
在我的例子中,我忘记继承自 IClassFixture
接口...
错误...
public class DatabaseIntegrationTests
{
正确...
public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{
我有同样的错误,但对我来说问题是我忘记制作 CollectionDefinition
class public
例如
错误
[CollectionDefinition("Live tests")]
class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
正确
[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
在我的例子中,夹具和集合在一个共享的测试程序集中。我发现XUnit DI找不到它。因此,我必须定义一个夹具,它继承了共享程序集中的那些 类 以共享功能,同时让它在我的测试 类.
中注册
我们的许多 TestFixture classes 具有相似的名称。因此,确保定义中的测试夹具类型与传递到包含测试的 class 上的构造函数的类型完全匹配。
如果您的 Collection 的构造函数抛出错误,也会发生这种情况。您可能需要通过其他方式调试该代码,因为 xUnit 提供的错误消息在这种情况下没有帮助。
我刚刚 运行 进入这个,我不得不将集合定义放入与测试相同的命名空间 class。不只是同一个程序集。
就我而言,我有两个 class 库。
Tests.Infrastructure.csproj
和
Tests.Web.csproj
Database fixture
不会注入存储在 Tests.Web.csproj
中的测试。 Fixture
在第二个 class 库中实现,Tests.Infrastructore.csproj
。
我将 fixture
的实现移到了 Tests.Web.csproj
,删除了 Infrastructure
,现在一切正常
如果您有多个测试项目,每个项目都应该有自己的 Fixture
和 Collection
。
您不能在项目之间使用共享 Fixture
或 Collection
。
To be clear, what I believe to be the bug is that we only search for collection definitions in the test assembly, not in all the assemblies.
This does not mean that we would support a single collection fixture instances across test assemblies. Each test assembly runes isolated in its own App Domain. You could still get a new instance of the collection fixture per App Domain
我正在使用 xUnit 2.0 collection fixtures 在多个不同的测试 class 之间共享一个公共数据库 setup/teardown。 fixture 还提供了一些辅助属性,所以我将它注入到每个测试中 class.
我在文档中重新创建了示例,但是当我 运行 测试时,它立即失败并显示:
The following constructor parameters did not have matching fixture data: IntegrationTestFixture fixture
无论我使用的是 xUnit Facts 还是 Theories,或者我使用的是哪种测试 运行ner,这似乎都会发生。
夹具:
public class IntegrationTestFixture : IDisposable
{
public IntegrationTestFixture()
{
// (setup code)
this.GeneratedTestName = [randomly generated];
}
public void Dispose()
{
// (teardown code)
}
public string GeneratedTestName { get; private set; }
}
集合定义:
[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
测试:
[CollectionDefinition("Live tests")]
public class SomeTests
{
private readonly IntegrationTestFixture fixture;
public SomeTests(IntegrationTestFixture fixture)
{
this.fixture = fixture;
}
[Fact]
public void MyTestMethod()
{
// ... test here
}
}
这是一个愚蠢的错误,我花了一些时间才弄清楚为什么它不起作用:
[CollectionDefinition]
继续集合定义 class,但 [Collection]
继续测试 class。我当时处于自动驾驶状态,没有注意到这一点。
如果您在不同的 class 上有 多个 [CollectionDefinition]
具有相同名称的属性,您也会得到这个。就用一个吧!
在我的例子中,我忘记继承自 IClassFixture
接口...
错误...
public class DatabaseIntegrationTests
{
正确...
public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{
我有同样的错误,但对我来说问题是我忘记制作 CollectionDefinition
class public
例如
错误
[CollectionDefinition("Live tests")]
class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
正确
[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
在我的例子中,夹具和集合在一个共享的测试程序集中。我发现XUnit DI找不到它。因此,我必须定义一个夹具,它继承了共享程序集中的那些 类 以共享功能,同时让它在我的测试 类.
中注册我们的许多 TestFixture classes 具有相似的名称。因此,确保定义中的测试夹具类型与传递到包含测试的 class 上的构造函数的类型完全匹配。
如果您的 Collection 的构造函数抛出错误,也会发生这种情况。您可能需要通过其他方式调试该代码,因为 xUnit 提供的错误消息在这种情况下没有帮助。
我刚刚 运行 进入这个,我不得不将集合定义放入与测试相同的命名空间 class。不只是同一个程序集。
就我而言,我有两个 class 库。
Tests.Infrastructure.csproj
和
Tests.Web.csproj
Database fixture
不会注入存储在 Tests.Web.csproj
中的测试。 Fixture
在第二个 class 库中实现,Tests.Infrastructore.csproj
。
我将 fixture
的实现移到了 Tests.Web.csproj
,删除了 Infrastructure
,现在一切正常
如果您有多个测试项目,每个项目都应该有自己的 Fixture
和 Collection
。
您不能在项目之间使用共享 Fixture
或 Collection
。
To be clear, what I believe to be the bug is that we only search for collection definitions in the test assembly, not in all the assemblies.
This does not mean that we would support a single collection fixture instances across test assemblies. Each test assembly runes isolated in its own App Domain. You could still get a new instance of the collection fixture per App Domain