Skip to content

Latest commit

 

History

History
73 lines (57 loc) · 1.86 KB

README.md

File metadata and controls

73 lines (57 loc) · 1.86 KB

.NET Unit Test Framework Comparison - Enum Iteration

2023/11/05 - Coenraad Stijne

Note: A follow up post describes how to reimplement NUnit's [ValuesAttribute] in MSTest and xUnit.
See .NET Unit Test Framework Comparison - Combinatorial Parameters.


Summary:

  • NUnit is the only library that support Enum iteration natively.
  • For MSTest and xUnit, we can create our own custom attributes.

Framework Overview

Framework Version
MSTest 3.1.1
NUnit 4.5.0
xUnit 2.6.1

MSTest

[AttributeUsage(AttributeTargets.Method)]
public class EnumDataAttribute<T> : Attribute, ITestDataSource where T : struct, Enum
{
    public IEnumerable<object?[]> GetData(MethodInfo testMethod) => Enum.GetValues<T>().Select(e => new object[] { e });

    public string? GetDisplayName(MethodInfo methodInfo, object?[]? data)
    {
        return $"{methodInfo.Name}({data![0]})";
    }
}

[TestClass]
public class UnitTest1
{
    [TestMethod]
    [EnumData<Season>]
    public void EnumIterationTest(Season season) => Console.WriteLine(season);
}

NUnit

public class Tests
{
    [Test]
    public void EnumIterationTest([Values] Season season) => Console.WriteLine(season);
}

xUnit

[AttributeUsage(AttributeTargets.Method)]
public class EnumDataAttribute<T> : DataAttribute where T : struct, Enum
{
    public override IEnumerable<object[]> GetData(MethodInfo testMethod) => Enum.GetValues<T>().Select(e => new object[] { e });
}

public class UnitTest1
{
    [Theory]
    [EnumData<Season>]
    public void EnumIterationTest(Season season) => Console.WriteLine(season);
}