Как сказал Рубен Бартелинк в своем ответе, «SELECT не сломан», это означает, что это очень важная особенность 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
для каждогоtest, singleton фактически делает так, чтобы они использовали один и тот же экземпляр.
В моем случае я смотрел на тестовые классы независимо и не осознавал, что существует singleton, поэтому я предположил, что проблема связана сс тестовыми приборами (неверное предположение).И из-за частей, которые я пропустил, задавая вопрос, для кого-то было невозможно правильно понять, что было неправильно.
Мораль истории: