Search code examples
vs-unit-testing-framework

Is there a way to skip tests in base classes?


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);
    }
}

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.