【问题标题】:Invalid signature for SetUp or TearDown method - What am I doing wrong?SetUp 或 TearDown 方法的签名无效 - 我做错了什么?
【发布时间】:2014-10-17 06:53:13
【问题描述】:

我正在尝试使用 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;
        }
    }

【问题讨论】:

  • 安装需要抛出异常。

标签: c#-4.0 tdd nunit installation


【解决方案1】:

您之前是使用构造函数注入来注入依赖项的,对吧?我认为您将无法使用用SetUpAttribute 装饰的方法执行依赖注入,因为这种方法必须是无参数的。另外Setup 方法必须是public,参见this SO thread

我们公司通常如何处理类似情况:

[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"));
    }
}

或者,如果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();
    }
}

【讨论】:

  • 你好 Michal,你的帖子和其他 SO 线程的链接帮助我更改了代码,使其通过了测试。
【解决方案2】:

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

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

【讨论】:

  • 我相信这正是我在回答中说“设置方法必须公开”的意思:)
  • @MichalHosala - 没有注意到这一点,因为答案主要涉及如何传递依赖项。我通常在答案末尾添加这种信息(重要但附带信息)作为其自己段落中的注释以可见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2019-07-21
  • 1970-01-01
  • 2020-02-14
  • 2019-07-26
相关资源
最近更新 更多