Question

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);
    }
}
Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top