6

[Theory]属性で装飾された単体テストで承認を使用しようとすると、次のように表示されます。

System.Exception: System.Exception : Approvals is not set up to use your test framework.
It currently supports [NUnit, MsTest, MbUnit, xUnit.net]
To add one use ApprovalTests.StackTraceParsers.StackTraceParser.AddParser() method to add implementation of ApprovalTests.StackTraceParsers.IStackTraceParser with support for your testing framework.
To learn how to implement one see http://blog.approvaltests.com/2012/01/creating-namers.html
   at ApprovalTests.StackTraceParsers.StackTraceParser.Parse(StackTrace stackTrace)
   at ApprovalTests.Namers.UnitTestFrameworkNamer..ctor()
   at ApprovalTests.Approvals.GetDefaultNamer()
   at ApprovalTests.Approvals.Verify(IApprovalWriter writer)
   at ApprovalTests.Approvals.Verify(Object text)

[Fact]属性のみを認識するようです。スタックトレースからのリンクをたどろうとしまし たが、独自のネーマー/パーサーを承認にプラグインする方法については何もありません。

独自のネーマー/パーサーを追加できるエントリポイントはありますか?それ自体は些細なことのようですが、唯一の問題はそれをどのように使用するかです。

 public class TheoryNamer : AttributeStackTraceParser
    {
        protected override string GetAttributeType()
        {
            return typeof(TheoryAttribute).FullName;
        }

        public override string ForTestingFramework
        {
            get { return "xUnit Extensions"; }
        }
    }
4

2 に答える 2

7

この回答と質問にはいくつかの部分があります。

  1. 追加する方法
  2. ネーマー
  3. 承認テストでのデータ駆動型テストの処理

1)追加する方法

追加は簡単です(少しラフな場合)。前述の方法は静的である必要がありますが、それでも機能します。

1つ追加するには、ApprovalTests.StackTraceParsers.StackTraceParser.AddParser()メソッドを使用して、テストフレームワークをサポートするApprovalTests.StackTraceParsers.IStackTraceParserの実装を追加します。

だからあなたはする必要があります

new StackTraceParser().AddParser(new TheoryNamer());

申し訳ありませんが、次のバージョン(v.21)では静的になります

2)ネーマー

Namerは、承認/受信されたファイルごとに一意の名前を生成することを想定しています。これは通常、メソッドの名前で行われますが、理論ベースのテストはデータ駆動型であり、したがって同じメソッドへの複数の呼び出しがあるため、ここでの名前は一意ではありません。

Naming:  classname.methodname(optional: .additionalInformation).received.extension

そのため、おそらくそれ自体のメソッドに追加情報を含める必要があります

public class StringTests1
{
    [Theory,
    InlineData("goodnight moon"),
    InlineData("hello world")]
    public void Contains(string input)
    {
        NamerFactory.AdditionalInformation = input;  // <- important
        Approvals.Verify(transform(input));
    }
} 

3)承認テストでのデータ駆動型テストの処理

正直なところ、ほとんどの場合、承認テストでのデータ駆動型のアプローチ方法は、メソッドデコレータのパラメータを介したものではありません。これは通常、ラムダ変換を使用したVerifyAllを介して行われます。たとえば、上記は次のようになります。

[Fact]
public void UpperCase()
{
    var inputs = new[]{"goodnight moon","hello world"};
    Approvals.VerifyAll(inputs, i => "{0} => {1}".FormatWith(i, i.ToUpperInvariant()));
}

受信したファイルを作成します。

goodnight moon => GOODNIGHT MOON
hello world => HELLO WORLD
于 2012-08-21T12:56:32.227 に答える
1

XUnitStackTraceParserからTheoryNamerクラスを継承することをお勧めします。
それは完璧に動作します!
そのようなクラスをApprovalTests.StackTraceParsers名前空間に追加するのはクールだと思います:)

public class XUnitTheoryStackTraceParser : XUnitStackTraceParser
{
    public const string TheoryAttribute = "Xunit.Extensions.TheoryAttribute";

    protected override string GetAttributeType()
    {
        return TheoryAttribute;
    }
}

public class ApproveTheoryTest
{
    static ApproveTheoryTest()
    {
        StackTraceParser.AddParser(new XUnitTheoryStackTraceParser());
    }

    [Theory]
    [UseReporter(typeof(DiffReporter))]
    [InlineData("file1.txt")]
    [InlineData("file2.txt")]
    public void approve_file(string fileName)
    {
        NamerFactory.AdditionalInformation = fileName;
        Approvals.Verify("sample text");
    }
}
于 2012-11-10T00:40:09.280 に答える