SetUp或TearDown方法的签名无效 - 我做错了什么?

nic*_*wdy 17 tdd installation nunit c#-4.0

我正在尝试使用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"));
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的班级使用这个界面

 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mic*_*ala 19

您之前使用构造函数注入注入依赖项,对吧?我认为你将无法使用装饰的方法执行依赖注入,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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

或者如果构造ValidInputDonor便宜那么我们只需为每个测试创建新实例,为此目的使用特殊方法,因此当我们决定测试另一个实现时,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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*xei 14

除了接受的答案中提到的原因外,我在将方法保留为非公开(privateprotected)时遇到了同样的错误.

NUnit很可能依赖于反射并且不处理非公共方法,因此必须使用特殊方法(即用NUnit特定属性修饰)public.