I'm using C# 4.0, Visual Studio 2010 and am annotating my methods/classes with the attributes from the Microsoft.VisualStudio.TestTools.UnitTesting
namespace.
I'd like to use inheritance in my test classes where each additional inheritance represents something changing or being created. If I could get it to not run tests from the base classes, then everything would be fine. Here's a rough example:
public class Person
{
public int Energy { get; private set; }
public int AppleCount { get; private set; }
public Person()
{
this.Energy = 10;
this.AppleCount = 5;
}
public void EatApple()
{
this.Energy += 5;
this.AppleCount--;
}
}
[TestClass]
public class PersonTest
{
protected Person _person;
[TestInitialize]
public virtual void Initialize()
{
this._person = new Person();
}
[TestMethod]
public void PersonTestEnergy()
{
Assert.AreEqual(10, this._person.Energy);
}
[TestMethod]
public void PersonTestAppleCount()
{
Assert.AreEqual(5, this._person.AppleCount);
}
}
[TestClass]
public class PersonEatAppleTest : PersonTest
{
[TestInitialize]
public override void Initialize()
{
base.Initialize();
this._person.EatApple();
}
[TestMethod]
public void PersonEatAppleTestEnergy()
{
Assert.AreEqual(15, this._person.Energy);
}
[TestMethod]
public void PersonEatAppleTestAppleCount()
{
Assert.AreEqual(4, this._person.AppleCount);
}
}
I asked a coworker and he suggested separating the initializing code from the testing. Inherit all the setup code, but then place all the tests for a particular setup in a class that inherits from said setup code. So the above would become:
public class Person
{
public int Energy { get; private set; }
public int AppleCount { get; private set; }
public Person()
{
this.Energy = 10;
this.AppleCount = 5;
}
public void EatApple()
{
this.Energy += 5;
this.AppleCount--;
}
}
[TestClass]
public class PersonSetup
{
protected Person _person;
[TestInitialize]
public virtual void Initialize()
{
this._person = new Person();
}
}
[TestClass]
public class PersonTest : PersonSetup
{
[TestMethod]
public void PersonTestEnergy()
{
Assert.AreEqual(10, this._person.Energy);
}
[TestMethod]
public void PersonTestAppleCount()
{
Assert.AreEqual(5, this._person.AppleCount);
}
}
[TestClass]
public class PersonEatAppleSetup : PersonSetup
{
[TestInitialize]
public override void Initialize()
{
base.Initialize();
this._person.EatApple();
}
}
[TestClass]
public class PersonEatAppleTest : PersonEatAppleSetup
{
[TestMethod]
public void PersonEatAppleTestEnergy()
{
Assert.AreEqual(15, this._person.Energy);
}
[TestMethod]
public void PersonEatAppleTestAppleCount()
{
Assert.AreEqual(4, this._person.AppleCount);
}
}
If someone else knows how to skip inherited methods like I originally asked, then I'll accept that. If not, then eventually I'll accept this answer.