Недопустимая подпись для метода SetUp или TearDown. Что я делаю неправильно?
Я пытаюсь сделать инъекцию зависимостей для своих тестов, используя nUnit. Я новичок в TDD и nUnit, поэтому я могу пропустить что-то простое. Поэтому в основном я создал метод SetUp для своих интерфейсов. Я изначально использовал конструктор, но при чтении TDD я плохо читал, поэтому теперь использую метод.
Когда я запускаю свой тест, я создаю объект и назначаю его интерфейсу, а затем вызываю метод с использованием этого интерфейса. Я хочу проверить, может ли он разбирать строку десятичной.
Когда я запускаю свой тест, он говорит, что тест завершился неудачно, и сообщение: Недопустимая подпись для метода SetUp или TearDown
См. Ниже фактический код:
public class DonorTests
{
private IDonor _Donor;
private IValidateInput _ValidInput;
//DonorTests(IDonor donor, IValidateInput validInput)
//{
// _Donor = donor;
// _ValidInput = validInput;
//}
[SetUp]
void Setup(IDonor donor, IValidateInput validInput)
{
_Donor = donor;
_ValidInput = validInput;
}
[Test]
public void HandleStringNotDecimal()
{
_ValidInput = new ValidateInput();
Assert.IsTrue(_ValidInput.IsDecimal("3445.3450"));
}
}
Мой класс, который использует этот интерфейс
public class ValidateInput : IValidateInput
{
public decimal RoundTwoDecimalPlaces(decimal amount)
{
return Math.Round(amount);
}
public bool IsDecimal(string amount)
{
decimal ParsedDecimal;
return Decimal.TryParse(amount, out ParsedDecimal);
}
public decimal ConvertToString(string value)
{
decimal ParsedDecimal;
Decimal.TryParse(value, out ParsedDecimal);
return ParsedDecimal;
}
}
Ответы
Ответ 1
Вы впрыскиваете зависимости, используя инъекцию конструктора раньше, правильно? Я думаю, что вы не сможете выполнить инъекцию зависимости, используя метод, украшенный SetUpAttribute
потому что такой метод должен быть без параметров. Также метод Setup
должен быть public
, см. Этот поток SO.
Как мы обычно имеем дело с подобными ситуациями в нашей компании:
[TestFixture]
public class DonorTests
{
private IDonor _Donor;
private IValidateInput _ValidInput;
[SetUp]
public void Setup()
{
_Donor = new Donor();
_ValidInput = new ValidateInput();
}
[Test]
public void HandleStringNotDecimal()
{
Assert.IsTrue(_ValidInput.IsDecimal("3445.3450"));
}
}
Или, если строительство ValidInput
и Donor
дешево, мы просто создаем новый экземпляр для каждого теста, имея специальный метод для этой цели, поэтому, когда мы решаем протестировать другую реализацию IValidateInput
, достаточно изменить его только в одном месте:
[TestFixture]
public class DonorTests
{
[Test]
public void HandleStringNotDecimal()
{
var validInput = CreateValidateInput();
Assert.IsTrue(validInput .IsDecimal("3445.3450"));
}
private static IValidateInput CreateValidateInput()
{
return new ValidateInput();
}
}
Ответ 2
Помимо причины, упомянутой в принятом ответе, я встретил ту же ошибку, оставив метод как непубличный (private
или protected
).
NUnit скорее всего полагается на размышления и не занимается непубличными методами, поэтому специальные методы (т.е. Украшенные специфическими атрибутами NUnit) должны быть public
.