NUnitを使用して、テストの依存性注入を実行しようとしています。私はTDDとnUnitに慣れていないので、単純なものが欠けている可能性があります。したがって、基本的には、インターフェイス用のSetUpメソッドを作成しました。私はもともとコンストラクターを使用していましたが、TDDを実行するときにこれを実行するのは悪いことだと読んだので、現在はメソッドを使用しています。
テストを実行するときは、オブジェクトを作成してインターフェイスに割り当て、そのインターフェイスを使用してメソッドを呼び出します。文字列の10進数を解析できるかどうかをテストしたいと思います。
テストを実行すると、テストが失敗したと表示され、メッセージは次のとおりです。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;
}
}
以前はコンストラクター注入を使用して依存性を注入していましたよね? 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
の別の実装をテストすることにします。次に、1か所で変更するだけで十分です。
[TestFixture]
public class DonorTests
{
[Test]
public void HandleStringNotDecimal()
{
var validInput = CreateValidateInput();
Assert.IsTrue(validInput .IsDecimal("3445.3450"));
}
private static IValidateInput CreateValidateInput()
{
return new ValidateInput();
}
}
受け入れられた回答に記載されている原因に加えて、メソッドを非公開(private
またはprotected
)として残すときに同じエラーが発生しました。
NUnitはおそらくリフレクションに依存し、非公開メソッドを処理しないため、特別なメソッド(つまり、NUnit固有の属性で装飾されている)はpublic
である必要があります。