Source: kevintsengtw/dotnet-testing-agent-skills (MIT). Ported into dotnet-agent-harness.
DateTime and Time-Dependent Testing Guide
Applicable Scenarios
This skill guides how to use Microsoft.Bcl.TimeProvider to solve testing problems with time-dependent code. Through time
abstraction, make "current time" controllable, predictable, and reproducible.
Applicable Scenarios
- Business Hours Validation: System determines whether to allow operations based on current time
- Promotion Control: Logic that activates during specific dates or time periods
- Cache Expiration Mechanism: Determines whether data is valid based on time
- Scheduled Task Triggers: Background jobs that run at scheduled times
- Token Expiration: Security mechanisms that are time-sensitive
Required Packages
<!-- Production code -->
<PackageReference Include="Microsoft.Bcl.TimeProvider" Version="9.0.0" />
<!-- Test project -->
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" Version="9.0.0" />
```text
---
## Core Principles
### Principle One: Time Abstraction - Replace DateTime with TimeProvider
**Traditional Problem Code**:
```csharp
// ❌ Untestable - uses static time directly
public class OrderService
{
public bool CanPlaceOrder()
{
var now = DateTime.Now;
return now.Hour >= 9 && now.Hour < 17;
}
}
```text
**Testable Refactoring**:
```csharp
// ✅ Testable - receives TimeProvider through dependency injection
public class OrderService
{
private readonly TimeProvider _timeProvider;
public OrderService(TimeProvider timeProvider)
{
_timeProvider = timeProvider ?? throw new ArgumentNullException(nameof(timeProvider));
}
public bool CanPlaceOrder()
{
var now = _timeProvider.GetLocalNow();
return now.Hour >= 9 && now.Hour < 17;
}
}
```text
**Dependency Injection Configuration**:
```csharp
// Program.cs - production environment uses system time
services.AddSingleton(TimeProvider.System);
services.AddScoped<OrderService>();
```text
### Principle Two: FakeTimeProvider Controls Test Time
FakeTimeProvider provides complete time control capabilities:
| Method | Purpose | When to Use |
| ------ | ------- | ----------- |
| `SetUtcNow(DateTimeOffset)` | Set UTC time | When precise UTC time is needed |
| `SetLocalTimeZone(TimeZoneInfo)` | Set local timezone | When testing timezone-related logic |
| `Advance(TimeSpan)` | Fast-forward time | When testing expiration, delay logic |
| `GetUtcNow()` | Get UTC time | Read current simulated time |
| `GetLocalNow()` | Get local time | Read local simulated time |
**Recommended Extension Method**:
```csharp
public static class FakeTimeProviderExtensions
{
/// <summary>
/// Sets FakeTimeProvider local time
/// </summary>
public static void SetLocalNow(this FakeTimeProvider fakeTimeProvider, DateTime localDateTime)
{
fakeTimeProvider.SetLocalTimeZone(TimeZoneInfo.Local);
var utcTime = TimeZoneInfo.ConvertTimeToUtc(localDateTime, TimeZoneInfo.Local);
fakeTimeProvider.SetUtcNow(utcTime);
}
}
```text
### Principle Three: Each Test Uses Independent Time Environment
```csharp
// ✅ Correct: each test creates independent FakeTimeProvider
public class OrderServiceTests
{
[Fact]
public void CanPlaceOrder_DuringBusinessHours_ShouldReturnTrue()
{
// Arrange - independent instance
var fakeTimeProvider = new FakeTimeProvider();
fakeTimeProvider.SetLocalNow(new DateTime(2024, 3, 15, 14, 0, 0));
var sut = new OrderService(fakeTimeProvider);
// Act
var result = sut.CanPlaceOrder();
// Assert
result.Should().BeTrue();
}
}
// ❌ Avoid: multiple tests sharing static instance
public class BadTestClass
{
private static readonly FakeTimeProvider SharedProvider = new(); // will interfere with each other
}
```text
---
## Advanced Time Control Techniques
### Time Freezing
When you need to verify multiple operations occur at the "same time point":
```csharp
[Fact]
public void ProcessBatch_AtFixedTimePoint_ShouldGenerateSameTimestamp()
{
var fakeTimeProvider = new FakeTimeProvider();
var fixedTime = new DateTime(2024, 12, 25, 10, 30, 0);
fakeTimeProvider.SetLocalNow(fixedTime);
var processor = new BatchProcessor(fakeTimeProvider);
var result1 = processor.ProcessItem("Item1");
var result2 = processor.ProcessItem("Item2");
// Time is frozen, both operations have same timestamp
result1.Timestamp.Should().Be(result2.Timestamp);
}
```text
### Time Fast-Forward (Advance)
Test time-sensitive logic like cache expiration, token invalidation:
```csharp
[Fact]
public void Cache_AfterExpirationTime_ShouldClearItems()
{
var fakeTimeProvider = new FakeTimeProvider();
fakeTimeProvider.SetLocalNow(new DateTime(2024, 3, 15, 10, 0, 0));
var cache = new TimedCache(fakeTimeProvider, TimeSpan.FromMinutes(5));
cache.Set("key", "value");
// After 3 minutes - not yet expired
fakeTimeProvider.Advance(TimeSpan.FromMinutes(3));
cache.Get("key").Should().Be("value");
// After another 3 minutes (total 6 minutes) - expired
fakeTimeProvider.Advance(TimeSpan.FromMinutes(3));
cache.Get("key").Should().BeNull();
}
```text
> **Important**: `Advance()` is non-blocking, instantly jumps time without actually waiting.
### Time Rewind
Test historical data processing or replay scenarios:
```csharp
[Fact]
public void HistoricalDataProcessor_GoingBackInTime_ShouldProcessCorrectly()
{
var fakeTimeProvider = new FakeTimeProvider();
var historicalTime = new DateTime(2020, 1, 15, 9, 0, 0);
fakeTimeProvider.SetLocalNow(historicalTime);
var processor = new HistoricalDataProcessor(fakeTimeProvider);
var result = processor.ProcessDataForDate(historicalTime.Date);
result.ProcessedAt.Should().Be(historicalTime);
}
```text
---
## Practical Testing Patterns
### Pattern One: Parameterized Boundary Testing
```csharp
[Theory]
[InlineData(8, false)] // 8 AM - before business hours
[InlineData(9, true)] // 9 AM - business hours start
[InlineData(12, true)] // 12 PM - during business hours
[InlineData(16, true)] // 4 PM - during business hours
[InlineData(17, false)] // 5 PM - business hours end
[InlineData(18, false)] // 6 PM - after business hours
public void CanPlaceOrder_AtDifferentTimes_ShouldReturnCorrectResult(int hour, bool expected)
{
var fakeTimeProvider = new FakeTimeProvider();
fakeTimeProvider.SetLocalNow(new DateTime(2024, 3, 15, hour, 0, 0));
var sut = new OrderService(fakeTimeProvider);
sut.CanPlaceOrder().Should().Be(expected);
}
```text
### Pattern Two: Trading Hours Window Testing
```csharp
[Theory]
[InlineData("09:30:00", true)] // Morning trading hours
[InlineData("12:00:00", false)] // Lunch break
[InlineData("14:30:00", true)] // Afternoon trading hours
[InlineData("15:30:00", false)] // After trading ends
public void IsInTradingHours_AtDifferentTimes_ShouldReturnCorrectResult(string timeStr, bool expected)
{
var fakeTimeProvider = new FakeTimeProvider();
var testTime = DateTime.Today.Add(TimeSpan.Parse(timeStr));
fakeTimeProvider.SetLocalNow(testTime);
var sut = new TradingService(fakeTimeProvider);
sut.IsInTradingHours().Should().Be(expected);
}
```text
### Pattern Three: Schedule Trigger Logic Testing
```csharp
[Theory]
[InlineData("2024-03-15 14:30:00", "2024-03-15 14:00:00", true)] // Time to execute
[InlineData("2024-03-15 13:30:00", "2024-03-15 14:00:00", false)] // Not yet time
public void ShouldExecuteJob_BasedOnTime_ShouldReturnCorrectResult(
string currentTimeStr, string scheduledTimeStr, bool expected)
{
var fakeTimeProvider = new FakeTimeProvider();
fakeTimeProvider.SetLocalNow(DateTime.Parse(currentTimeStr));
var schedule = new JobSchedule { NextExecutionTime = DateTime.Parse(scheduledTimeStr) };
var sut = new ScheduleService(fakeTimeProvider);
sut.ShouldExecuteJob(schedule).Should().Be(expected);
}
```text
---
## AutoFixture Integration
### FakeTimeProviderCustomization
```csharp
public class FakeTimeProviderCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Register(() => new FakeTimeProvider());
}
}
```text
### AutoDataWithCustomization Attribute
```csharp
public class AutoDataWithCustomizationAttribute : AutoDataAttribute
{
public AutoDataWithCustomizationAttribute() : base(CreateFixture)
{
}
private static IFixture CreateFixture()
{
return new Fixture()
.Customize(new AutoNSubstituteCustomization())
.Customize(new FakeTimeProviderCustomization());
}
}
```text
### Using Matching.DirectBaseType
```csharp
[Theory]
[AutoDataWithCustomization]
public void GetTimeBasedDiscount_OnFriday_ShouldReturnTenPercentDiscount(
[Frozen(Matching.DirectBaseType)] FakeTimeProvider fakeTimeProvider,
OrderService sut)
{
// Matching.DirectBaseType tells AutoFixture:
// When TimeProvider (base type) is needed, use FakeTimeProvider (derived type)
var fridayTime = new DateTime(2024, 3, 15, 14, 0, 0); // Friday
fakeTimeProvider.SetLocalNow(fridayTime);
sut.GetTimeBasedDiscount().Should().Be("Happy Friday: 10% Discount");
}
```text
> **Key**: Must use `[Frozen(Matching.DirectBaseType)]`, otherwise AutoFixture cannot correctly inject FakeTimeProvider into constructors requiring TimeProvider.
---
## Best Practices Checklist
### ✅ Code Design
- [ ] All time-dependent classes receive `TimeProvider` through constructor
- [ ] Use `_timeProvider.GetLocalNow()` instead of `DateTime.Now`
- [ ] Use `_timeProvider.GetUtcNow()` instead of `DateTime.UtcNow`
- [ ] DI container registers `TimeProvider.System` as production implementation
### ✅ Test Design
- [ ] Each test method uses independent `FakeTimeProvider` instance
- [ ] Use `SetLocalNow()` extension method to simplify time setup
- [ ] Use `Advance()` to test time-sensitive logic (cache, expiration, delay)
- [ ] Tests cover boundary conditions (start time, end time, critical points)
### ✅ Advanced Considerations
- [ ] FakeTimeProvider is thread-safe, can be used for parallel tests
- [ ] Use `IDisposable` pattern to properly dispose FakeTimeProvider
- [ ] Use `SetLocalTimeZone()` to explicitly set timezone for timezone tests
---
## Reference Resources
### Original Articles
This skill content is distilled from the "Old School Software Engineer's Testing Practice - 30 Day Challenge" article series:
- **Day 16 - Testing Dates and Times: Replace DateTime with Microsoft.Bcl.TimeProvider**
- Article: https://ithelp.ithome.com.tw/articles/10375821
- Sample code: https://github.com/kevintsengtw/30Days_in_Testing_Samples/tree/main/day16
### Official Documentation
- [TimeProvider API](https://learn.microsoft.com/dotnet/api/system.timeprovider)
- [Microsoft.Bcl.TimeProvider NuGet](https://www.nuget.org/packages/Microsoft.Bcl.TimeProvider/)
- [Microsoft.Extensions.TimeProvider.Testing NuGet](https://www.nuget.org/packages/Microsoft.Extensions.TimeProvider.Testing/)
### Related Skills
- `autofixture-basics` - AutoFixture automatic test data generation
- `nsubstitute-mocking` - Test doubles and mocking
- `autodata-xunit-integration` - xUnit and AutoFixture AutoData integration
1---2name: dotnet-testing-datetime-testing-timeprovider-33description: "Specialized skill for testing time-dependent logic using TimeProvider. Use when testing DateTime, controlling time flow, handling timezone conversions, and testing expiration logic. Covers TimeProvider abstraction, FakeTimeProvider time control, time freezing and fast-forwarding. Keywords: datetime, time testing, TimeProvider, FakeTimeProvider, DateTime.Now, time-dependent, cache expiration, token expiration, Microsoft.Bcl.TimeProvider, GetUtcNow, SetUtcNow, Advance, time freeze, time freezing, time fast-forward"4---5Source: kevintsengtw/dotnet-testing-agent-skills (MIT). Ported into dotnet-agent-harness.67# DateTime and Time-Dependent Testing Guide89## Applicable Scenarios1011This skill guides how to use Microsoft.Bcl.TimeProvider to solve testing problems with time-dependent code. Through time12abstraction, make "current time" controllable, predictable, and reproducible.1314### Applicable Scenarios1516- **Business Hours Validation**: System determines whether to allow operations based on current time17- **Promotion Control**: Logic that activates during specific dates or time periods18- **Cache Expiration Mechanism**: Determines whether data is valid based on time19- **Scheduled Task Triggers**: Background jobs that run at scheduled times20- **Token Expiration**: Security mechanisms that are time-sensitive2122### Required Packages2324````xml25<!-- Production code -->26<PackageReference Include="Microsoft.Bcl.TimeProvider" Version="9.0.0" />2728<!-- Test project -->29<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" Version="9.0.0" />30```text3132---3334## Core Principles3536### Principle One: Time Abstraction - Replace DateTime with TimeProvider3738**Traditional Problem Code**:3940```csharp41// ❌ Untestable - uses static time directly42public class OrderService43{44 public bool CanPlaceOrder()45 {46 var now = DateTime.Now;47 return now.Hour >= 9 && now.Hour < 17;48 }49}50```text5152**Testable Refactoring**:5354```csharp55// ✅ Testable - receives TimeProvider through dependency injection56public class OrderService57{58 private readonly TimeProvider _timeProvider;5960 public OrderService(TimeProvider timeProvider)61 {62 _timeProvider = timeProvider ?? throw new ArgumentNullException(nameof(timeProvider));63 }6465 public bool CanPlaceOrder()66 {67 var now = _timeProvider.GetLocalNow();68 return now.Hour >= 9 && now.Hour < 17;69 }70}71```text7273**Dependency Injection Configuration**:7475```csharp76// Program.cs - production environment uses system time77services.AddSingleton(TimeProvider.System);78services.AddScoped<OrderService>();79```text8081### Principle Two: FakeTimeProvider Controls Test Time8283FakeTimeProvider provides complete time control capabilities:8485| Method | Purpose | When to Use |86| ------ | ------- | ----------- |87| `SetUtcNow(DateTimeOffset)` | Set UTC time | When precise UTC time is needed |88| `SetLocalTimeZone(TimeZoneInfo)` | Set local timezone | When testing timezone-related logic |89| `Advance(TimeSpan)` | Fast-forward time | When testing expiration, delay logic |90| `GetUtcNow()` | Get UTC time | Read current simulated time |91| `GetLocalNow()` | Get local time | Read local simulated time |9293**Recommended Extension Method**:9495```csharp96public static class FakeTimeProviderExtensions97{98 /// <summary>99 /// Sets FakeTimeProvider local time100 /// </summary>101 public static void SetLocalNow(this FakeTimeProvider fakeTimeProvider, DateTime localDateTime)102 {103 fakeTimeProvider.SetLocalTimeZone(TimeZoneInfo.Local);104 var utcTime = TimeZoneInfo.ConvertTimeToUtc(localDateTime, TimeZoneInfo.Local);105 fakeTimeProvider.SetUtcNow(utcTime);106 }107}108```text109110### Principle Three: Each Test Uses Independent Time Environment111112```csharp113// ✅ Correct: each test creates independent FakeTimeProvider114public class OrderServiceTests115{116 [Fact]117 public void CanPlaceOrder_DuringBusinessHours_ShouldReturnTrue()118 {119 // Arrange - independent instance120 var fakeTimeProvider = new FakeTimeProvider();121 fakeTimeProvider.SetLocalNow(new DateTime(2024, 3, 15, 14, 0, 0));122 var sut = new OrderService(fakeTimeProvider);123124 // Act125 var result = sut.CanPlaceOrder();126127 // Assert128 result.Should().BeTrue();129 }130}131132// ❌ Avoid: multiple tests sharing static instance133public class BadTestClass134{135 private static readonly FakeTimeProvider SharedProvider = new(); // will interfere with each other136}137```text138139---140141## Advanced Time Control Techniques142143### Time Freezing144145When you need to verify multiple operations occur at the "same time point":146147```csharp148[Fact]149public void ProcessBatch_AtFixedTimePoint_ShouldGenerateSameTimestamp()150{151 var fakeTimeProvider = new FakeTimeProvider();152 var fixedTime = new DateTime(2024, 12, 25, 10, 30, 0);153 fakeTimeProvider.SetLocalNow(fixedTime);154155 var processor = new BatchProcessor(fakeTimeProvider);156157 var result1 = processor.ProcessItem("Item1");158 var result2 = processor.ProcessItem("Item2");159160 // Time is frozen, both operations have same timestamp161 result1.Timestamp.Should().Be(result2.Timestamp);162}163```text164165### Time Fast-Forward (Advance)166167Test time-sensitive logic like cache expiration, token invalidation:168169```csharp170[Fact]171public void Cache_AfterExpirationTime_ShouldClearItems()172{173 var fakeTimeProvider = new FakeTimeProvider();174 fakeTimeProvider.SetLocalNow(new DateTime(2024, 3, 15, 10, 0, 0));175176 var cache = new TimedCache(fakeTimeProvider, TimeSpan.FromMinutes(5));177 cache.Set("key", "value");178179 // After 3 minutes - not yet expired180 fakeTimeProvider.Advance(TimeSpan.FromMinutes(3));181 cache.Get("key").Should().Be("value");182183 // After another 3 minutes (total 6 minutes) - expired184 fakeTimeProvider.Advance(TimeSpan.FromMinutes(3));185 cache.Get("key").Should().BeNull();186}187```text188189> **Important**: `Advance()` is non-blocking, instantly jumps time without actually waiting.190191### Time Rewind192193Test historical data processing or replay scenarios:194195```csharp196[Fact]197public void HistoricalDataProcessor_GoingBackInTime_ShouldProcessCorrectly()198{199 var fakeTimeProvider = new FakeTimeProvider();200 var historicalTime = new DateTime(2020, 1, 15, 9, 0, 0);201 fakeTimeProvider.SetLocalNow(historicalTime);202203 var processor = new HistoricalDataProcessor(fakeTimeProvider);204 var result = processor.ProcessDataForDate(historicalTime.Date);205206 result.ProcessedAt.Should().Be(historicalTime);207}208```text209210---211212## Practical Testing Patterns213214### Pattern One: Parameterized Boundary Testing215216```csharp217[Theory]218[InlineData(8, false)] // 8 AM - before business hours219[InlineData(9, true)] // 9 AM - business hours start220[InlineData(12, true)] // 12 PM - during business hours221[InlineData(16, true)] // 4 PM - during business hours222[InlineData(17, false)] // 5 PM - business hours end223[InlineData(18, false)] // 6 PM - after business hours224public void CanPlaceOrder_AtDifferentTimes_ShouldReturnCorrectResult(int hour, bool expected)225{226 var fakeTimeProvider = new FakeTimeProvider();227 fakeTimeProvider.SetLocalNow(new DateTime(2024, 3, 15, hour, 0, 0));228229 var sut = new OrderService(fakeTimeProvider);230231 sut.CanPlaceOrder().Should().Be(expected);232}233```text234235### Pattern Two: Trading Hours Window Testing236237```csharp238[Theory]239[InlineData("09:30:00", true)] // Morning trading hours240[InlineData("12:00:00", false)] // Lunch break241[InlineData("14:30:00", true)] // Afternoon trading hours242[InlineData("15:30:00", false)] // After trading ends243public void IsInTradingHours_AtDifferentTimes_ShouldReturnCorrectResult(string timeStr, bool expected)244{245 var fakeTimeProvider = new FakeTimeProvider();246 var testTime = DateTime.Today.Add(TimeSpan.Parse(timeStr));247 fakeTimeProvider.SetLocalNow(testTime);248249 var sut = new TradingService(fakeTimeProvider);250251 sut.IsInTradingHours().Should().Be(expected);252}253```text254255### Pattern Three: Schedule Trigger Logic Testing256257```csharp258[Theory]259[InlineData("2024-03-15 14:30:00", "2024-03-15 14:00:00", true)] // Time to execute260[InlineData("2024-03-15 13:30:00", "2024-03-15 14:00:00", false)] // Not yet time261public void ShouldExecuteJob_BasedOnTime_ShouldReturnCorrectResult(262 string currentTimeStr, string scheduledTimeStr, bool expected)263{264 var fakeTimeProvider = new FakeTimeProvider();265 fakeTimeProvider.SetLocalNow(DateTime.Parse(currentTimeStr));266267 var schedule = new JobSchedule { NextExecutionTime = DateTime.Parse(scheduledTimeStr) };268 var sut = new ScheduleService(fakeTimeProvider);269270 sut.ShouldExecuteJob(schedule).Should().Be(expected);271}272```text273274---275276## AutoFixture Integration277278### FakeTimeProviderCustomization279280```csharp281public class FakeTimeProviderCustomization : ICustomization282{283 public void Customize(IFixture fixture)284 {285 fixture.Register(() => new FakeTimeProvider());286 }287}288```text289290### AutoDataWithCustomization Attribute291292```csharp293public class AutoDataWithCustomizationAttribute : AutoDataAttribute294{295 public AutoDataWithCustomizationAttribute() : base(CreateFixture)296 {297 }298299 private static IFixture CreateFixture()300 {301 return new Fixture()302 .Customize(new AutoNSubstituteCustomization())303 .Customize(new FakeTimeProviderCustomization());304 }305}306```text307308### Using Matching.DirectBaseType309310```csharp311[Theory]312[AutoDataWithCustomization]313public void GetTimeBasedDiscount_OnFriday_ShouldReturnTenPercentDiscount(314 [Frozen(Matching.DirectBaseType)] FakeTimeProvider fakeTimeProvider,315 OrderService sut)316{317 // Matching.DirectBaseType tells AutoFixture:318 // When TimeProvider (base type) is needed, use FakeTimeProvider (derived type)319320 var fridayTime = new DateTime(2024, 3, 15, 14, 0, 0); // Friday321 fakeTimeProvider.SetLocalNow(fridayTime);322323 sut.GetTimeBasedDiscount().Should().Be("Happy Friday: 10% Discount");324}325```text326327> **Key**: Must use `[Frozen(Matching.DirectBaseType)]`, otherwise AutoFixture cannot correctly inject FakeTimeProvider into constructors requiring TimeProvider.328329---330331## Best Practices Checklist332333### ✅ Code Design334335- [ ] All time-dependent classes receive `TimeProvider` through constructor336- [ ] Use `_timeProvider.GetLocalNow()` instead of `DateTime.Now`337- [ ] Use `_timeProvider.GetUtcNow()` instead of `DateTime.UtcNow`338- [ ] DI container registers `TimeProvider.System` as production implementation339340### ✅ Test Design341342- [ ] Each test method uses independent `FakeTimeProvider` instance343- [ ] Use `SetLocalNow()` extension method to simplify time setup344- [ ] Use `Advance()` to test time-sensitive logic (cache, expiration, delay)345- [ ] Tests cover boundary conditions (start time, end time, critical points)346347### ✅ Advanced Considerations348349- [ ] FakeTimeProvider is thread-safe, can be used for parallel tests350- [ ] Use `IDisposable` pattern to properly dispose FakeTimeProvider351- [ ] Use `SetLocalTimeZone()` to explicitly set timezone for timezone tests352353---354355## Reference Resources356357### Original Articles358359This skill content is distilled from the "Old School Software Engineer's Testing Practice - 30 Day Challenge" article series:360361- **Day 16 - Testing Dates and Times: Replace DateTime with Microsoft.Bcl.TimeProvider**362 - Article: https://ithelp.ithome.com.tw/articles/10375821363 - Sample code: https://github.com/kevintsengtw/30Days_in_Testing_Samples/tree/main/day16364365### Official Documentation366367- [TimeProvider API](https://learn.microsoft.com/dotnet/api/system.timeprovider)368- [Microsoft.Bcl.TimeProvider NuGet](https://www.nuget.org/packages/Microsoft.Bcl.TimeProvider/)369- [Microsoft.Extensions.TimeProvider.Testing NuGet](https://www.nuget.org/packages/Microsoft.Extensions.TimeProvider.Testing/)370371### Related Skills372373- `autofixture-basics` - AutoFixture automatic test data generation374- `nsubstitute-mocking` - Test doubles and mocking375- `autodata-xunit-integration` - xUnit and AutoFixture AutoData integration376````