3

MEFを使用してVisualStudio拡張機能としてカスタム言語のカラーライザーを作成しています。私のコードのほとんどは、ここで入手できるOokLanguageIntegrationサンプルからのものです。私のカラーライザーはほぼ準備ができていますが、実装に適したユニットテストスイートを提供する必要があります。

このようなもののMEFの性質を考えると、ユニットテストへの適切なアプローチはどれかと思います。単体テストからTaggerを直接参照して、GetTagsメソッドをテストする必要がありますか?ユニットテストにMEFを含める必要がありますか?MEFベースのカラーライザーとカスタムIntellisense実装のテストに関する例はありますか?

4

1 に答える 1

2

わかりましたので、これを行うためのアプローチを得たと思います。それが理想的なアプローチかどうかはわかりませんが、コア ロジックをテストできます。ITextSnapshots のスタブを作成する方法を教えてくれた、Visual Studioの HQL 言語サービスの背後にいる人たちと、私のシナリオを設定する単体テストのセットとしてSpell Checker 拡張機能を持っているNoah Richardsに感謝します。

ここに私のTestFixtureのコードがあります:

[TestFixture]
public class TokenTaggerTests
{
  [Test]
  public void CanGetTagsForSimpleSelect()
  {
    TestQuery("SELECT * FROM Books", new List<string>() { "SELECT", "*", "FROM", "Books"});      
  }

  private void TestQuery(string query, List<string> expected)
  {
    ITextSnapshot snapshot = SnapshotUtil.CreateSnapshot(query);
    NormalizedSnapshotSpanCollection spans = new NormalizedSnapshotSpanCollection(snapshot.CreateSpanFromLineNumber(0));

    MyTokenTagProvider provider = new MyTokenTagProvider();
    ITagger<ITag> tagger = provider.CreateTagger<ITag>(new Mock<ITextBuffer>().Object);

    List<string> words = tagger.GetTags(spans).Select(s => query.Substring(s.Span.Start, s.Span.Length)).ToList();

    string errorMessage = string.Format("Got list: [{0}].  Expected: [{1}]", string.Join(", ", words), string.Join(", ", expected));

    CollectionAssert.AreEqual(expected, words, errorMessage);
  }
}

TestQuery メソッドでは、SnapshotUtil で CreateSnapshot を呼び出すことから始めます。これは、入力テキストに基づいて ITextSnapshot オブジェクトを作成する HQL Language Service テスト プロジェクトにある便利なクラスで、VS が拡張機能に提供するものをシミュレートします。次に、MyTokenTagProvider を使用してタガーを作成します。ここでは、 Moqと呼ばれるこの強力なものを使用して、ITextBuffer オブジェクトのモックを作成します。これは、CreateTagger の想定される入力パラメーターです。

タガーができたので、残りはそれをいじって、それが機能しているかどうかを確認するだけです。GetTags は、入力クエリを受け取り、識別できた一連のタグを出力するメソッドであるため、ここでテストしたいコア メソッドです。実際の単語を取得するには、各タグのスパンを調べ、それを使用して元のクエリから単語を抽出します。NUnit の CollectionAssert メソッドは、単語の出力リストが予想されるリストと一致することを確認します。

うまくいけば、これは VS エディター拡張機能を作成およびテストする他のすべての人に役立ちます。

于 2011-10-07T12:50:35.800 に答える