#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) { }
}