Ayende @ Rahien

My name is Oren Eini
Founder of Hibernating Rhinos LTD and RavenDB.
You can reach me by phone or email:


+972 52-548-6969

, @ Q c

Posts: 6,026 | Comments: 44,842

filter by tags archive

Easy extensibility: xUnit integration for DSL

time to read 2 min | 219 words

I saw several solution for extending NUnit and MbUnit to add new functionality, all of them were far too complex for me. I didn't want this complexity. Here is the entire code that I had to write in order to make xUnit integrate with my DSL:

public class DslFactAttribute : FactAttribute
	private readonly string path;

	public DslFactAttribute(string path)
		this.path = path;

	protected override IEnumerable<ITestCommand> EnumerateTestCommands(MethodInfo method)
		DslFactory dslFactory = new DslFactory();
				new TestQuoteGenerationDslEngine());
		TestQuoteGeneratorBase[] tests = dslFactory.CreateAll<TestQuoteGeneratorBase>(path);
		for(var test in tests)
			Type dslType = test.GetType();
			BindingFlags flags = BindingFlags.DeclaredOnly |
				BindingFlags.Public |
			foreach (MethodInfo info in dslType
				if (info.Name.StartsWith("with"))
					yield return new DslRunnerTestCommand(dslType, info);

And the DslTestRunnerCommand:

public class DslRunnerTestCommand : ITestCommand
	private readonly MethodInfo testToRun;
	private readonly Type dslType;

	public DslRunnerTestCommand(Type dslType, MethodInfo testToRun)
		this.dslType = dslType;
		this.testToRun = testToRun;

	public MethodResult Execute(object ignored)
		object instance = Activator.CreateInstance(dslType);
		return new TestCommand(testToRun).Execute(instance);

	public string Name
		get { return testToRun.Name; }

That is what I am talking about when I am talking about easy extensibility.




... now we only need to add .GetFileEx() after .Execute(instance).

this realy is the right stuff

Comment preview

Comments have been closed on this topic.


No future posts left, oh my!


  1. Technical observations from my wife (3):
    13 Nov 2015 - Production issues
  2. Production postmortem (13):
    13 Nov 2015 - The case of the “it is slow on that machine (only)”
  3. Speaking (5):
    09 Nov 2015 - Community talk in Kiev, Ukraine–What does it take to be a good developer
  4. Find the bug (5):
    11 Sep 2015 - The concurrent memory buster
  5. Buffer allocation strategies (3):
    09 Sep 2015 - Bad usage patterns
View all series


Main feed Feed Stats
Comments feed   Comments Feed Stats