Navigation
« kicking and screaming | Main | Testing out marsedit »
Friday
Jan182008

NSpecify Nunit add-in fix for InitializeFunctionality methods

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
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


Reader Comments (2)

Thanks Owen, it is now committed.
If you have any more input, just let me know!

January 22, 2008 | Unregistered Commenterbennage

Thanks Owen, it is now committed.
If you have any more input, just let me know!

January 22, 2008 | Unregistered Commenterbennage

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>