カスタム FXCop ルールを使用して、各単体テストの先頭でメソッドが呼び出され、すべての単体テスト コードがそのメソッドに渡されるアクションの一部であることを確認したいと考えています。基本的に私はこれが欲しい:
[TestMethod]
public void SomeTest()
{
Run(() => {
// ALL unit test code has to be inside a Run call
});
}
Run が実際に呼び出されていることを確認するのは難しくありません。
public override void VisitMethod(Method member)
{
var method = member as Method;
if (method == null || method.Attributes == null)
return;
if (method.Attributes.Any(attr => attr.Type.Name.Name == "TestMethodAttribute") &&
method.Instructions != null)
{
if (!method.Instructions.Any(i => i.OpCode == OpCode.Call || i.Value.ToString() == "MyNamespace.Run"))
{
this.Problems.Add(new Problem(this.GetResolution(), method.GetUnmangledNameWithoutTypeParameters()));
}
base.VisitMethod(method);
}
秘訣は、テストの先頭に、Run ステートメントの前に呼び出されるものがないことを確認することです。 ここ数時間、Instructions コレクションのパターンをハッキングし、コードで Body.Statements コレクションを効果的に使用する方法を理解しようと努めてきました。
これは、単純な IL の質問として提起することもできます。 これを受け入れる検証可能な特定のパターンを知りたい:
public void SomeTest()
{
Run(() => {
// Potentially lots of code
});
}
ただし、次のいずれかを拒否します。
public void SomeTest()
{
String blah = “no code allowed before Run”;
Run(() => {
// Potentially lots of code
});
}
public void SomeTest()
{
Run(() => {
// Potentially lots of code
});
String blah = “no code allowed after Run”;
}