C# NUnit Не найдено подходящего конструктора даже при использовании TestFixture

#c# #nunit

Вопрос:

Я использую NUnit в C# для выполнения некоторых модульных тестов. У меня есть такая структура наследования классов:

 [TestFixture(null)]
public abstract class BaseTests
{
    protected BaseTests(StatusesEnum? status)
    {
    }

    [Test]
    public abstract void TestMethod_1();
}



[TestFixture(null)]
public class SalesTests : BaseTests
{
    protected SalesTests(StatusesEnum? status) : base(status)
    {
    }

    //When I run this test from this class it throws the "No suitable constructor was found"
    [Test]
    public override void TestMethod_1()
    {
    }
}



//When I run the test from this class it works perfectly since it passes value to the constructor
public class CustomerTests : SalesTests
{
    public CustomerTests() : base (StatusesEnum.New) { }
}
 

Когда я запускаю CustomerTests , они работают идеально, и они звонят TestMEthos_1 из SalesTests , как и ожидалось.

Но когда я запускаю только тот SalesTests класс, из которого я продолжаю получать исключение No suitable constructor found . Ожидаемым результатом должно быть то, что status параметр будет равен нулю, и тесты должны пройти, так как я проверяю этот параметр в методе тестов.

Я нашел много ответов, в которых говорилось просто добавить [TestFixture] атрибут, но это тоже не помогло. Так что любая идея о том, как это исправить, была бы отличной.

Комментарии:

1. Какова точная полная ошибка? Также — Решарпер или встроенный тестовый раннер VS?

2. Точная ошибка заключается в том, что «Не было найдено подходящего конструктора», и я использую встроенные тесты VS

3. Только это? Больше ничего? Не могли бы вы, пожалуйста, добавить скриншот, если это возможно, пожалуйста?

4. Я также попытался передать StatusEnum. Новый, и он тоже не работал

5. Можете ли вы добавить конструктор по умолчанию для класса? Это решило бы проблему — какую проблему вы пытаетесь решить? Какой смысл в том, чтобы что-то жестко закодированное было передано на проверку?

Ответ №1:

Похоже, для этого NUnit требуется, чтобы конструктор был общедоступным. Следующая настройка сработала для меня (изменен SalesTests модификатор доступности ctor и добавлен TestFixtureAttribute в CustomerTests ):

 [TestFixture(null)]
public class SalesTests : BaseHfsTests
{
    public SalesTests(StatusesEnum? status) : base(status)
    {
    }

    [Test]
    public override void TestMethod_1()
    {
    }
}

[TestFixture]
public class CustomerTests : SalesTests
{
    public CustomerTests() : base(StatusesEnum.New)
    {
        
    }
}
 

Комментарии:

1. Я почти уверен, что я тоже пытался публично

2. @LiranFriedman Я получил ту же ошибку с вашим кодом, изменив модификаторы доступа конструктора, чтобы public исправить ее для меня. Хотя я не нашел никакого подтверждения в документах.

3. И вы оставили [TestFixture(null)]? Кроме того, вы пытались запустить тесты продаж, а не только тесты клиентов?

4. @LiranFriedman Я полностью скопировал ваш код (только переименован SalesBasedOnWeekDayTests -> > SalesTests ). И запустите оба теста.

5. Мои извинения, тесты продаж были переименованием, которое я сделал, чтобы сократить класс для этого поста. В моем коде не было опечатки

Ответ №2:

Я решил эту проблему, просто изменив оба базовых класса ( BaseTests amp; SalesTests ) abstract , поскольку abstract class они не запускают тесты сами по себе, только наследующие классы запускают свои тесты.

 public abstract class BaseTests
{
    protected BaseTests(StatusesEnum? status)
    {
    }

    [Test]
    public abstract void TestMethod_1();
}

public abstract class SalesTests : BaseTests
{
    protected SalesTests(StatusesEnum? status) : base(status)
    {
    }

    [Test]
    public override void TestMethod_1()
    {
    }
}

public class CustomerTests : SalesTests
{
    public CustomerTests() : base (StatusesEnum.New) { }
}