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

标签 c#-4.0 tdd nunit installation

我正在尝试使用 nUnit 为我的测试进行一些依赖注入(inject)。我是 TDD 和 nUnit 的新手,所以我可能错过了一些简单的东西。基本上我已经为我的界面创建了一个 SetUp 方法。我最初使用的是构造函数,但我读到在进行 TDD 时这样做很不好,所以我现在使用了一种方法。

当我运行测试时,我构造一个对象并将其分配给接口(interface),然后使用该接口(interface)调用一个方法。我想测试它是否可以解析字符串小数。

当我运行测试时,它说测试失败,消息是: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"));
        }
    }

使用此接口(interface)的我的类

 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;
        }
    }

最佳答案

您之前使用构造函数注入(inject)来注入(inject)依赖项,对吗?我认为您将无法使用用 SetUpAttribute 装饰的方法执行依赖项注入(inject),因为此类方法必须是无参数的。此外,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();
    }
}

关于c#-4.0 - SetUp 或 TearDown 方法的签名无效 - 我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25463605/

相关文章:

c# - Assert.IsInstanceOfType 无法从对象转换为 System.Type

c# - 我想要类似 switch 语句的东西(但当然不同)

c# - 单个 .cs 文件中的多个类 - 好还是坏?

pdf - 如何在 C# 中打开 pdf 等文件 "from"一个 windows 窗体应用程序

c# - 多次检查字符串中的字符

java - 测试驱动开发。断言类的内部结构是否正确?

javascript - 人们使用什么 javascript 模拟框架?

c# - 尝试从 Mono NUnit 测试中获取调试输出

ruby-on-rails - 未定义的方法`use_transactional_fixtures

visual-studio - 实时测试不适用于 NUnit