正如RubenBartelink在他的回答中所说,“选择并没有被破坏”,这意味着这是Xunit的一个非常核心的特性,Xunit是一个经过充分验证的测试框架,这个问题不太可能出现在他们这边。
此外,深入挖掘XUnit代码,这就是它生成类设备所做的工作:(
Source
)
var createClassFixtureAsyncTasks = new List<Task>();
foreach (var interfaceType in testClassTypeInfo.ImplementedInterfaces.Where(i => i.GetTypeInfo().IsGenericType && i.GetGenericTypeDefinition() == typeof(IClassFixture<>)))
createClassFixtureAsyncTasks.Add(CreateClassFixtureAsync(interfaceType.GetTypeInfo().GenericTypeArguments.Single()));
if (TestClass.TestCollection.CollectionDefinition != null)
{
var declarationType = ((IReflectionTypeInfo)TestClass.TestCollection.CollectionDefinition).Type;
foreach (var interfaceType in declarationType.GetTypeInfo().ImplementedInterfaces.Where(i => i.GetTypeInfo().IsGenericType && i.GetGenericTypeDefinition() == typeof(IClassFixture<>)))
createClassFixtureAsyncTasks.Add(CreateClassFixtureAsync(interfaceType.GetTypeInfo().GenericTypeArguments.Single()));
}
await Task.WhenAll(createClassFixtureAsyncTasks);
从呼叫到
CreateClassFixtureAsync
很容易看出课堂固定装置是
每次重新生成
对于测试用例。
那为什么我观察到这种行为呢?
我不小心在我的示例中简化了我应该有的更多。我发现这可能是一个更好的例子:
public class FixtureData
{
public object SomeValue => HiddenSingleton.Instance.SomeValue;
}
public class HiddenSingleton
{
private static HiddenSingleton _instance;
public static HiddenSingleton Instance
{
get
{
if (_instance != null) return _instance;
_instance = new HiddenSingleton();
return _instance;
}
}
public object SomeValue { get; set; }
}
public class TestForNull : IClassFixture<FixtureData>
{
private readonly FixtureData _data;
public TestForNull(FixtureData data)
{
_data = data;
}
[Fact]
public void TestForNull()
{
_data.SomeValue = null;
Assert.Null(_data.SomeValue);
}
}
public class TestForObject : IClassFixture<FixtureData>
{
private readonly FixtureData _data;
public TestForObject(FixtureData data)
{
_data = data;
}
[Fact]
public void TestForObject()
{
Assert.NotNull(_data.SomeValue);
}
}
在这种情况下,直接观察它是非常明显的:即使Xunit生成一个独立的
FixtureData
例如,对于每个测试,单例实例实际上使其使用相同的实例。
在我的例子中,我是独立地查看测试类的,我没有意识到有一个单例,所以我假设问题与测试夹具相关(错误的假设)。因为我问问题时遗漏了一些部分,所以不可能有人正确地发现问题所在。
故事的寓意: