4

単体テスト用のカスタム Assert クラスを作成しましたが、テストが失敗したことを通知したいときに何をすればよいかわかりません。

public static class MyAssert
{
    public static void Contains(File file, string text){
        if(!ContainText(file, text)){
            // what to do here?
        }
    }
}

ClassをMicrosoft.VisualStudio.TestTools.UnitTesting.Assertリフレクトしたところ、HandleFail を呼び出していることがわかりました。

internal static void HandleFail(string assertionName, string message, params object[] parameters)
{
  string str = string.Empty;
  if (!string.IsNullOrEmpty(message))
    str = parameters != null ? string.Format((IFormatProvider) CultureInfo.CurrentCulture, Assert.ReplaceNulls((object) message), parameters) : Assert.ReplaceNulls((object) message);
  if (Assert.AssertionFailure != null)
    Assert.AssertionFailure((object) null, EventArgs.Empty);
  throw new AssertFailedException((string) FrameworkMessages.AssertionFailed((object) assertionName, (object) str));
}

しかし、これは内部メソッドです。リフレクションを使用して呼び出すことができますか、それとも AssertFailedException をスローする方が理にかなっているでしょうか? 私が見逃している別のオプションはありますか?

4

2 に答える 2

5

カスタム Assert メソッドを標準の assert メソッドとまったく同じように動作させるには、 new をスローする必要がありますAssertFailedExceptionAssertFailedException最初は、デバッガーが実際の assert ステートメントではなく、throw ステートメントで停止するため、これが本当に好きではありませんでした。もう少し調査した後、DebuggerHiddenメソッド属性とビオラを発見しました。アサートは期待どおりに機能します。

[DebuggerHidden]
public static void Contains(File file, string text){
    if(!ContainText(file, text)){
        HandleFail("MyAssert.Contains", null, null);
    }
}

[DebuggerHidden]
private static void HandleFail(string assertName, string message, params object[] parameters )
{
    message = message ?? String.Empty;
    if (parameters == null)
    {
        throw new AssertFailedException(String.Format("{0} failed. {1}", assertName, message));
    }
    else
    {
        throw new AssertFailedException(String.Format("{0} failed. {1}", assertName, String.Format(message, parameters)));
    }
}
于 2013-04-02T12:16:38.300 に答える
2

Assertカスタム内から標準を呼び出すだけです。

于 2013-03-29T23:54:45.663 に答える