Skip to content

Commit

Permalink
NUnit3: change the way test name is created so that it doesn't change…
Browse files Browse the repository at this point in the history
… between discovery and execution
  • Loading branch information
frblondin authored and Thomas Caudal committed Sep 25, 2017
1 parent 06ca10b commit 7ef166d
Show file tree
Hide file tree
Showing 10 changed files with 425 additions and 38 deletions.
Expand Up @@ -62,6 +62,8 @@
<Compile Include="NoAutoPropertiesAttributeTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Scenario.cs" />
<Compile Include="TestNameStrategiesFixture.cs" />
<Compile Include="TestNameStrategiesTest.cs" />
<Compile Include="ThrowingStubFixture.cs" />
<Compile Include="TypeWithCustomizationAttributes.cs" />
</ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion Src/AutoFixture.NUnit3.UnitTest/Scenario.cs
Expand Up @@ -378,7 +378,7 @@ public void InlineAutoDataCanBeUsedWithFrozen(int p1, int p2, [Frozen]string p3,

[Theory, AutoData]
public void NoAutoPropertiesAttributeLeavesPropertiesUnset(
[NoAutoProperties]PropertyHolder<object> ph1,
[NoAutoProperties]PropertyHolder<object> ph1,
[NoAutoProperties]PropertyHolder<string> ph2,
[NoAutoProperties]PropertyHolder<int> ph3
)
Expand Down
85 changes: 85 additions & 0 deletions Src/AutoFixture.NUnit3.UnitTest/TestNameStrategiesFixture.cs
@@ -0,0 +1,85 @@
using NUnit.Framework.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ploeh.AutoFixture.NUnit3.UnitTest
{
public class TestNameStrategiesFixture
{
#region Custom attribute definitions
public const int InjectedIntValue = 1;
public const string InjectedStringValue = "foo";

private static IFixture CreateFixtureWithInjectedValues()
{
var result = new Fixture();
// Make so that fixed values will be returned
result.Inject(InjectedIntValue);
result.Inject(InjectedStringValue);
return result;
}

public class AutoDataFixedNameAttribute : AutoDataAttribute
{
public AutoDataFixedNameAttribute()
{
TestMethodBuilder = new FixedNameTestMethodBuilder();
}
}

public class AutoDataDefaultNameAttribute : AutoDataAttribute
{
public AutoDataDefaultNameAttribute() : base(CreateFixtureWithInjectedValues())
{
}
}

public class InlineAutoDataFixedNameAttribute : InlineAutoDataAttribute
{
public InlineAutoDataFixedNameAttribute(params object[] arguments) : base(arguments)
{
TestMethodBuilder = new FixedNameTestMethodBuilder();
}
}

public class InlineAutoDataDefaultNameAttribute : InlineAutoDataAttribute
{
public InlineAutoDataDefaultNameAttribute(params object[] arguments) : base(CreateFixtureWithInjectedValues(), arguments)
{
}
}
#endregion

[AutoDataFixedName]
public void FixedNameDecoratedMethod(
int expectedNumber, MyClass sut)
{
}

[AutoDataDefaultName]
public void DefaultAttributeStrategyDecoratedMethod(
int expectedNumber, string value)
{
}

[InlineAutoDataFixedName("alpha", "beta")]
public void InlineFixedNameDecoratedMethod(string p1, string p2, string p3)
{
}

[InlineAutoDataDefaultName("alpha", "beta")]
public void DefaultInlineAttributeStrategyDecoratedMethod(string p1, string p2, string p3)
{
}

public static TestMethod GetTestMethod<TAttribute>(string testName) where TAttribute : Attribute, NUnit.Framework.Interfaces.ITestBuilder
{
var method = new MethodWrapper(typeof(TestNameStrategiesFixture), testName);
var inlineAttribute = (TAttribute)Attribute.GetCustomAttribute(method.MethodInfo, typeof(TAttribute));
var testMethod = inlineAttribute.BuildFrom(method, null).Single();
return testMethod;
}
}
}
133 changes: 133 additions & 0 deletions Src/AutoFixture.NUnit3.UnitTest/TestNameStrategiesTest.cs
@@ -0,0 +1,133 @@
using NUnit.Framework;
using NUnit.Framework.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using static Ploeh.AutoFixture.NUnit3.UnitTest.TestNameStrategiesFixture;

namespace Ploeh.AutoFixture.NUnit3.UnitTest
{
public class TestNameStrategiesTest
{
[Test]
public void AutoDataAttributeUsesRealValueByDefault()
{
// Fixture setup
// Exercise system
var sut = new AutoDataAttribute();
// Verify outcome
Assert.That(sut.TestMethodBuilder,
Is.TypeOf<MutableNameTestMethodBuilder>());
// Teardown
}

[Test]
public void InlineAutoDataAttributeUsesRealValueByDefault()
{
// Fixture setup
// Exercise system
var sut = new InlineAutoDataAttribute();
// Verify outcome
Assert.That(sut.TestMethodBuilder,
Is.TypeOf<MutableNameTestMethodBuilder>());
// Teardown
}

[Test]
public void AutoDataUsesFixedValuesForTestName()
{
// Fixture setup
// Exercise system
var testMethod = GetTestMethod<AutoDataFixedNameAttribute>(nameof(TestNameStrategiesFixture.FixedNameDecoratedMethod));
// Verify outcome
Assert.That(testMethod.Name,
Is.EqualTo(nameof(TestNameStrategiesFixture.FixedNameDecoratedMethod) + "(auto<Int32>,auto<MyClass>)"));
// Teardown
}

[Test]
public void AutoDataFixedNameUsesFixedValuesForTestFullName()
{
// Fixture setup
// Exercise system
var testMethod = GetTestMethod<AutoDataFixedNameAttribute>(nameof(TestNameStrategiesFixture.FixedNameDecoratedMethod));
// Verify outcome
Assert.That(testMethod.FullName,
Is.EqualTo(typeof(TestNameStrategiesFixture).FullName + "." + nameof(TestNameStrategiesFixture.FixedNameDecoratedMethod) + "(auto<Int32>,auto<MyClass>)"));
// Teardown
}

[Test]
public void AutoDataUsesRealValuesForTestNameByDefault()
{
// Fixture setup
// Exercise system
var testMethod = GetTestMethod<AutoDataDefaultNameAttribute>(nameof(TestNameStrategiesFixture.DefaultAttributeStrategyDecoratedMethod));
// Verify outcome
Assert.That(testMethod.Name,
Is.EqualTo(nameof(TestNameStrategiesFixture.DefaultAttributeStrategyDecoratedMethod) + "(" + TestNameStrategiesFixture.InjectedIntValue + @",""" + TestNameStrategiesFixture.InjectedStringValue + @""")"));
// Teardown
}

[Test]
public void AutoDataUsesRealValuesForTestFullNameByDefault()
{
// Fixture setup
// Exercise system
var testMethod = GetTestMethod<AutoDataDefaultNameAttribute>(nameof(TestNameStrategiesFixture.DefaultAttributeStrategyDecoratedMethod));
// Verify outcome
Assert.That(testMethod.FullName,
Is.EqualTo(typeof(TestNameStrategiesFixture).FullName + "." + nameof(TestNameStrategiesFixture.DefaultAttributeStrategyDecoratedMethod) + "(" + TestNameStrategiesFixture.InjectedIntValue + @",""" + TestNameStrategiesFixture.InjectedStringValue + @""")"));
// Teardown
}

[Test]
public void InlineAutoDataUsesFixedValuesForTestName()
{
// Fixture setup
// Exercise system
var testMethod = GetTestMethod<InlineAutoDataFixedNameAttribute>(nameof(TestNameStrategiesFixture.InlineFixedNameDecoratedMethod));
// Verify outcome
Assert.That(testMethod.Name,
Is.EqualTo(nameof(TestNameStrategiesFixture.InlineFixedNameDecoratedMethod) + @"(""alpha"",""beta"",auto<String>)"));
// Teardown
}

[Test]
public void InlineAutoDataFixedNameUsesFixedValuesForTestFullName()
{
// Fixture setup
// Exercise system
var testMethod = GetTestMethod<InlineAutoDataFixedNameAttribute>(nameof(TestNameStrategiesFixture.InlineFixedNameDecoratedMethod));
// Verify outcome
Assert.That(testMethod.FullName,
Is.EqualTo(typeof(TestNameStrategiesFixture).FullName + "." + nameof(TestNameStrategiesFixture.InlineFixedNameDecoratedMethod) + @"(""alpha"",""beta"",auto<String>)"));
// Teardown
}

[Test]
public void InlineAutoDataUsesRealValuesForTestNameByDefault()
{
// Fixture setup
// Exercise system
var testMethod = GetTestMethod<InlineAutoDataDefaultNameAttribute>(nameof(TestNameStrategiesFixture.DefaultInlineAttributeStrategyDecoratedMethod));
// Verify outcome
Assert.That(testMethod.Name,
Is.EqualTo(nameof(TestNameStrategiesFixture.DefaultInlineAttributeStrategyDecoratedMethod) + @"(""alpha"",""beta"",""" + TestNameStrategiesFixture.InjectedStringValue + @""")"));
// Teardown
}

[Test]
public void InlineAutoDataFixedNameUsesRealValuesForTestFullNameByDefault()
{
// Fixture setup
// Exercise system
var testMethod = GetTestMethod<InlineAutoDataDefaultNameAttribute>(nameof(TestNameStrategiesFixture.DefaultInlineAttributeStrategyDecoratedMethod));
// Verify outcome
Assert.That(testMethod.FullName,
Is.EqualTo(typeof(TestNameStrategiesFixture).FullName + "." + nameof(TestNameStrategiesFixture.DefaultInlineAttributeStrategyDecoratedMethod) + @"(""alpha"",""beta"",""" + TestNameStrategiesFixture.InjectedStringValue + @""")"));
// Teardown
}
}
}
32 changes: 13 additions & 19 deletions Src/AutoFixture.NUnit3/AutoDataAttribute.cs
Expand Up @@ -5,6 +5,7 @@
using NUnit.Framework.Internal;
using NUnit.Framework.Internal.Builders;
using Ploeh.AutoFixture.Kernel;
using System.Diagnostics.CodeAnalysis;

namespace Ploeh.AutoFixture.NUnit3
{
Expand All @@ -13,11 +14,21 @@ namespace Ploeh.AutoFixture.NUnit3
/// This implementation is based on TestCaseAttribute of NUnit3
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes", Justification = "This attribute is the root of a potential attribute hierarchy.")]
[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes", Justification = "This attribute is the root of a potential attribute hierarchy.")]
public class AutoDataAttribute : Attribute, ITestBuilder
{
private readonly IFixture _fixture;

private ITestMethodBuilder _testMethodBuilder = new MutableNameTestMethodBuilder();
/// <summary>
/// Gets or sets the current <see cref="ITestMethodBuilder"/> strategy.
/// </summary>
public ITestMethodBuilder TestMethodBuilder
{
get => _testMethodBuilder;
set => _testMethodBuilder = value ?? throw new ArgumentNullException(nameof(value));
}

/// <summary>
/// Construct a <see cref="AutoDataAttribute"/>
/// </summary>
Expand Down Expand Up @@ -49,28 +60,11 @@ protected AutoDataAttribute(IFixture fixture)
/// <returns>One or more TestMethods</returns>
public IEnumerable<TestMethod> BuildFrom(IMethodInfo method, Test suite)
{
var test = new NUnitTestCaseBuilder().BuildTestMethod(method, suite, this.GetParametersForMethod(method));
var test = TestMethodBuilder.Build(method, suite, () => GetParameterValues(method.GetParameters()).ToArray(), 0);

yield return test;
}

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "This method is always expected to return an instance of the TestCaseParameters class.")]
private TestCaseParameters GetParametersForMethod(IMethodInfo method)
{
try
{
var parameters = method.GetParameters();

var parameterValues = this.GetParameterValues(parameters);

return new TestCaseParameters(parameterValues.ToArray());
}
catch (Exception ex)
{
return new TestCaseParameters(ex);
}
}

private IEnumerable<object> GetParameterValues(IEnumerable<IParameterInfo> parameters)
{
return parameters.Select(Resolve);
Expand Down
3 changes: 3 additions & 0 deletions Src/AutoFixture.NUnit3/AutoFixture.NUnit3.csproj
Expand Up @@ -71,6 +71,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="FixedNameTestMethodBuilder.cs" />
<Compile Include="InlineAutoDataAttribute.cs" />
<Compile Include="AutoDataAttribute.cs" />
<Compile Include="CustomizeAttribute.cs" />
Expand All @@ -84,6 +85,8 @@
<Compile Include="ModestAttribute.cs" />
<Compile Include="NoAutoPropertiesAttribute.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="MutableNameTestMethodBuilder.cs" />
<Compile Include="ITestMethodBuilder.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AutoFixture\AutoFixture.csproj">
Expand Down

0 comments on commit 7ef166d

Please sign in to comment.