27. August 2007 23:43
by Paul
I have uploaded a small development tool that I put together recently, its called
"Behaviour to Unit Test". Basically it converts code functionality from plain
sentences (or stories) into unit test stub code. You could also think
of it as a cure for TDD writers block!
For an example of the usage, use the Generation -> Fill
out example menu option and hit Convert. Basically it takes
a set of plain language behaviours for an object such as "person":
-
Check that the default values of all string properties are empty
-
The ToString method renders the first and last names
-
If the date of birth is null, calculate age will return -1
-
If the date of birth is not null, calculate age will return a value
...and converts them into something like:
using System;
using NUnit.Framework;
using NUnit.Framework.SyntaxHelpers;
namespace Tests
{
[TestFixture]
public class PersonEntityTests
{
private PersonEntity
person;
[SetUp]
public void TestSetUp()
{
person = new PersonEntity();
}
[Test]
[Ignore("Currently
only a unit test stub")]
public void CheckThatTheDefaultValuesOfAllStringPropertiesAreEmpty()
{
}
[Test]
[Ignore("Currently
only a unit test stub")]
public void TheToStringMethodRendersTheFirstAndLastNames()
{
}
[Test]
[Ignore("Currently
only a unit test stub")]
public void IfTheDateOfBirthIsNullCalculateAgeWillReturnMinus1()
{
}
[Test]
[Ignore("Currently
only a unit test stub")]
public void IfTheDateOfBirthIsNotNullCalculateAgeWillReturnAValue()
{
}
}
}
There are C# and VB.NET templates for now. Check it out:
http://www.pksoftware.net/BehaviourToUnitTest/
My intention is to keep the tool small and simple. The main thing I want to add at
the moment is some load/save functionality and drop in the ICSharp.TextEditor for
more friendly editing...
20. July 2007 01:21
by Paul
This is just a quick heads up to say that I think the Castle
Project rocks!
I have been using it allot of late especially Active
Record. I'll blog more detail later but it's what I have been looking for all
these years! Many time I have implemented simple subsets of the functionality that
Castle provides to help get the job done. Castle wraps up all those funky framework
fragments and more with a great "action pack" flavour to it in the form of Mono
Rail (i.e. 'ruby on rails' for .Net)
Very cool ;-)
13. June 2007 23:30
by Paul
Just a quick note that could drive you completely mad if you were not aware...
If you are using NUnitForms for testing your GUI and have code in the forms "Shown" event, it will not run unless you follow the Form.Show call with Application.DoEvents(), see sample code below
This example is just a Label (label1) dumped on a Form with the Load and Shown events updating the label with the respective event text:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace NUnitFormsDemo1
{
public partial class ShownTestForm : Form
{
public ShownTestForm()
{
InitializeComponent();
}
private void ShownTestForm_Load(object sender, EventArgs e)
{
label1.Text = "Load";
}
private void ShownTestForm_Shown(object sender, EventArgs e)
{
label1.Text = "Shown";
}
}
}
Here is some sample NUnitForms test code, the first test asserts that after the
Form.Show call the label text is "Load" and the second test shows that the label text is "Shown".
using System;
using System.Windows.Forms;
using NUnit.Framework;
using NUnit.Extensions.Forms;
namespace NUnitFormsDemo1.UnitTests
{
[TestFixture]
public class TestFormShownIssue : NUnitFormTest
{
[Test]
public void TestFormShow()
{
ShownTestForm frm = new ShownTestForm();
LabelTester label1Tester = new LabelTester("label1");
frm.Show();
Assert.AreEqual("Load", label1Tester.Text);
}
[Test]
public void TestFormShowWithDoEvents()
{
ShownTestForm frm = new ShownTestForm();
LabelTester label1Tester = new LabelTester("label1");
frm.Show();
Application.DoEvents(); // allows the 'Shown' event to fire
Assert.AreEqual("Shown", label1Tester.Text);
}
}
}
I will take an educated guess that this is due to the GUI message pump etc.
In general if I come across this any of this type of unexpected behavior with NUnitForms I will try a DoEvents before tearing my hair out.
8. June 2007 00:05
by Paul
I have had some questions regarding the icons (or rather images) that I use in my
applications (such as the 'pending' Mini
SQL Query tool)...
They are by Mark James -
he has a bunch of great free stuff available at:
http://famfamfam.com/ -
more so the "Silk" set at http://famfamfam.com/lab/icons/silk/
The images are licensed under a Creative
Commons Attribution 2.5 License.
18. May 2007 03:32
by Paul
This is the line of code that I keep forgetting...
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
Use it in (for example) the Program.Main function when the application starts up and
the threads currrent principal is now the windows user. So...
Thread.CurrentPrincipal.Identity.IsAuthenticated
Will now be
true and you can make use of the
Identity.Name property
etc.
Self reminder over...
More Notes...
If for example you need to perform unit tests as a windows user (to access the username
or hit a resource) you can make use of the
AppDomain.CurrentDomain.SetPrincipalPolicy method
in the test fixture setup/teardown methods - see example below. I put the UnauthenticatedPrincipal
setting in the teardown so that subsequent tests do not have their principal modified
by accident...
using System;
using System.Security.Principal;
using System.Threading;
using NUnit.Framework;
namespace Tests.SetPrincipalPolicyExample
{
[TestFixture]
public class TestSomethingUsingCurrentWindowsPrincipal
{
///
<summary>Called once before all tests are run.</summary>
[TestFixtureSetUp()]
public void TestFixtureSetUp()
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
}
///
<summary>Called once after all tests have run.</summary>
[TestFixtureTearDown()]
public void TestFixtureTearDown()
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.UnauthenticatedPrincipal);
}
[Test]
public void VerifySomething()
{
string expectedUsername = Thread.CurrentPrincipal.Identity.Name;
//
more testing stuff
}
}
}