Home > front end >  Is it possible to build your TestCaseSource list inside SetUp using NUnit?
Is it possible to build your TestCaseSource list inside SetUp using NUnit?

Time:09-17

Can I build my TestCaseData list in my SetUp? Because with this setup my test is just being skipped. Other regular tests are running just fine.

[TestFixture]
public class DirectReader
{
    private XDocument document;
    private DirectUblReader directReader;
    private static UblReaderResult result;

    private static List<TestCaseData> rootElementsTypesData = new List<TestCaseData>();

    [SetUp]
    public void Setup()
    {
        var fileStream = ResourceReader.GetScenario("RequiredElements_2_1.xml");
        document = XDocument.Load(fileStream);

        directReader = new DirectUblReader();

        result = directReader.Read(document);

        // Is this allowed?
        rootElementsTypesData.Add(new TestCaseData(result.Invoice.Id, new IdentifierType()));
        rootElementsTypesData.Add(new TestCaseData(result.Invoice.IssueDate, new IdentifierType()));
    }

    [Test, TestCaseSource(nameof(rootElementsTypesData))]
    public void Expects_TypeOfObject_ToBeTheSameAs_InputValue(object inputValue, object expectedTypeObject)
    {
        Assert.That(inputValue, Is.TypeOf(expectedTypeObject.GetType()));
    }
}

CodePudding user response:

No, this is impossible.

Methods decorated with [SetUp] are run before each test case.

This means NUnit will first build list of test cases, then run Setup() before each of them.

Therefore, your Setup() never gets called, and list of test cases remains empty.

CodePudding user response:

As stated by @IMil, the answer is No... that's not possible.

TestCaseSource is used by NUnit to build a list of the tests to be run. It associates a method with a particular set of arguments. NUnit then creates an internal representation of all your tests.

OTOH SetUp (and even OneTimeSetUp is used when those tests are being run. By that time, the number of tests and the actual arguments to each of them are fixed nothing can change them.

So, in order to do what you seem to want to do, your TestCaseSource has to stand on it's own, fully identifying the arguments to be used for the test. That's why NUnit gives you the capability of making the source a method or property, rather than just a simple list.

In your case, I suggest something like...

private static IEnumerable<TestCaseData> RootElementsTypesData()
{
    var fileStream = ResourceReader.GetScenario("RequiredElements_2_1.xml");
    document = XDocument.Load(fileStream);

    directReader = new DirectUblReader();

    result = directReader.Read(document);

    yield return new TestCaseData(result.Invoice.Id, new IdentifierType()));
    yield return new TestCaseData(result.Invoice.IssueDate, new IdentifierType()));
}

Obviously, this is only "forum code" and you'll have to work with it to get something that actually compiles and works for your case.

  • Related