Недопустимая подпись для метода 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.