我正在尝试使用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;
}
}
答案 0 :(得分:19)
您之前使用构造函数注入注入依赖项,对吧?我认为你将无法使用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"));
}
}
或者如果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();
}
}
答案 1 :(得分:13)
除了接受的答案中提到的原因外,我在将方法保留为非公开(private
或protected
)时遇到了同样的错误。
NUnit很可能依赖于反射并且不处理非公共方法,因此特殊方法(即用NUnit特定属性修饰)必须是public
。