Friday
Jan182008
NSpecify Nunit add-in fix for InitializeFunctionality methods
Friday, January 18, 2008 at 4:13PM
Well I still exist!
Recently I've been moving more and more into understanding how a specification test should be written using NSpecify a really nice framework for running tests.
Also I've been seriously involved in getting the teams build process up and running in a much more meaningful form, as such I've noticed a bug in the nunit add-in for NSpecify.
It wasn't running any of my InitializeFunctionality (Incidently i think this would be better named as ContextSetup and Functionality renamed to Context) methods.
I looked in the code and realised none of the setup's or teardowns were getting wired up, a quick modification and there all hunky dory.
2 changes are required:
NSpecifySuiteExtension.cs should look like this
And constants.cs just gets updated to this:
I've got a patch file if I can get the people who have write access to the NSpecify repository to apply it (there are no mailing lists for me to send it to)
Here it is
Recently I've been moving more and more into understanding how a specification test should be written using NSpecify a really nice framework for running tests.
Also I've been seriously involved in getting the teams build process up and running in a much more meaningful form, as such I've noticed a bug in the nunit add-in for NSpecify.
It wasn't running any of my InitializeFunctionality (Incidently i think this would be better named as ContextSetup and Functionality renamed to Context) methods.
I looked in the code and realised none of the setup's or teardowns were getting wired up, a quick modification and there all hunky dory.
2 changes are required:
NSpecifySuiteExtension.cs should look like this
using System;
using System.Reflection;
namespace NUnit.Core.Extensions
{
/// <summary>
/// NSpecifySuiteExtension extends test suite and creates a fixture that runs every specification implementing the NSpecify attributes.
/// Because it inherits from TestSuite, rather than TestFixture, it has to construct its own fixture object and find its
/// own specifications. Everything is done in the constructor for simplicity.
/// </summary>
internal class NSpecifySuiteExtension : TestSuite
{
#region C'tors
/// <summary>
/// Initializes a new instance of the <see cref="NSpecifySuiteExtension"/> class.
/// </summary>
/// <param name="fixtureType">Type of the fixture.</param>
public NSpecifySuiteExtension(Type fixtureType)
: base(fixtureType)
{
// Create the fixture object. We could wait to do this when
// it is needed, but we do it here for simplicity.
Fixture = Reflect.Construct(fixtureType);
fixtureSetUp = Reflect.GetMethodWithAttribute(fixtureType, Constants.InitializeFunctionalityAttribute, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, true);
fixtureTearDown = Reflect.GetMethodWithAttribute(fixtureType, Constants.CleanupFunctionalityAttribute, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, true);
// Locate our test methods and add them to the suite using
// the Add method of TestSuite. Note that we don't do a simple
// Tests.Add, because that wouldn't set the parent of the tests.
foreach (MethodInfo method in fixtureType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
{
Attribute spec = Reflect.GetAttribute(method, Constants.SpecificationAttribute, true);
if (spec != null)
{
Add(new NSpeicifyTestMethod(method));
}
}
}
#endregion
}
internal class NSpeicifyTestMethod : NUnitTestMethod
{
public NSpeicifyTestMethod(MethodInfo method)
: base(method)
{
setUpMethod = Reflect.GetMethodWithAttribute(FixtureType, Constants.SetupResourcesAttribute, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, true);
tearDownMethod = Reflect.GetMethodWithAttribute(FixtureType, Constants.DestroyResourcesAttribute, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, true);
}
}
}And constants.cs just gets updated to this:
namespace NUnit.Core.Extensions
{
/// <summary>
/// The constants
/// </summary>
public class Constants
{
public const string FunctionalityAttribute = "NSpecify.Framework.FunctionalityAttribute";
public const string InitializeFunctionalityAttribute = "NSpecify.Framework.InitializeFunctionalityAttribute";
public const string CleanupFunctionalityAttribute = "NSpecify.Framework.CleanupFunctionalityAttribute";
public const string SpecificationAttribute = "NSpecify.Framework.SpecificationAttribute";
public const string SetupResourcesAttribute = "NSpecify.Framework.SetupResourcesAttribute";
public const string DestroyResourcesAttribute = "NSpecify.Framework.DestroyResourcesAttribute";
public const string SuiteBuilders = "SuiteBuilders";
}
}
I've got a patch file if I can get the people who have write access to the NSpecify repository to apply it (there are no mailing lists for me to send it to)
Here it is
Owen Evans |
2 Comments | 
Reader Comments (2)
Thanks Owen, it is now committed.
If you have any more input, just let me know!
Thanks Owen, it is now committed.
If you have any more input, just let me know!