Kevin Craft
Kevin Craft

Reputation: 879

Is it possible to "inherit" tests with xUnit.net?

I have a concrete class called EventManager and a subclass called ScheduledEventManager. I would like ScheduledEventManager to have to pass the same tests as EventManager plus a few additional ones. Is this possible with xUnit.net?

EDIT: I just realized that my case is a little more complicated than this. I'm using nested classes to keep my tests more organized. Example:

public class EventManagerTests
{
    public class WhenAnEventIsFired
    {
        [Fact]
        void ItNotifiesSubscribers()
        {
            // Perform the test
        }
    }
}

public class ScheduledEventManagerTests
{
    // How to I inherit the above tests since they are in nested classes?
}

It seems to me that this is not possible, but maybe one of you geniuses knows something I don't.

Upvotes: 8

Views: 5057

Answers (2)

Ebram
Ebram

Reputation: 1102

Yes You can:

public abstract class EventManagerTests
{
     protected IEventManager _ev;
     protected EventManagerTests(IEventManager ev)
     {
          _ev = ev;
     }

     [Fact]
     public void SharedTest()
     {
        // Perform _ev test
     }

}

public class ScheduledEventManagerTests : EventManagerTests
{
    public ScheduledEventManagerTests():base(new ScheduledEventManager())
    {
    }

    // It will inherit tests from the base abstract class
}


public class UnScheduledEventManagerTests : EventManagerTests
{
    public UnScheduledEventManagerTests():base(new UnScheduledEventManager())
    {
    }

    // It will inherit tests from the base abstract class
}

enter image description here

Upvotes: 12

Preston Guillot
Preston Guillot

Reputation: 6724

Create a parameterized test that takes an instance of your base class as the SUT, and invoke the test with an instance of the sub class. Here's a (contrived) example using NUnit, which results in one passing and one failing test:

public class Foo
{
    public virtual int DoSomething()
    {
        return 10;
    }
}

public class Bar : Foo
{
    public override int DoSomething()
    {
        return 9;
    }
}

[TestFixture]
public class Tests
{
    private Foo[] _foos = { new Foo(), new Bar() };

    [Test]
    [TestCaseSource("_foos")]
    public void When_DoSomething_Is_Invoked_Then_A_Power_Of_Ten_Is_Returned(Foo sut)
    {
        Assert.That(sut.DoSomething() % 10, Is.EqualTo(0));
    }
}

Upvotes: -4

Related Questions