visual-studio-2010 - 如何对 Ook 语言集成示例进行单元测试?

标签 visual-studio-2010 plugins mef visual-studio-extensions

我正在使用 MEF 编写自定义语言着色器作为 Visual Studio 扩展。我的大部分代码来自可用的 Ook 语言集成示例 here .我的着色器已经准备就绪,但现在我需要为我的实现提供一个合适的单元测试套件。

考虑到这些东西的 MEF 性质,我想知道哪种方法适合进行单元测试。我是否应该直接从我的单元测试中引用我的标记器并测试 GetTags 方法?我应该让 MEF 参与我的单元测试吗?是否有任何关于测试基于 MEF 的着色器和自定义 Intellisense 实现的示例?

最佳答案

好的,所以我想我有办法做到这一点。不知道这是否是理想的方法,但允许我测试我的核心逻辑。感谢 HQL Language Service for Visual Studio 背后的人谁向我展示了如何为 ITextSnapshots 和 Noah Richards 创建 stub 谁的Spell Checker extension有一组单元测试,可以为我的单元测试设置场景。

这是我的 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。这是一个有用的类,可在 HQL 语言服务测试项目中找到,该项目将根据一些输入文本创建 ITextSnapshot 对象,模拟 VS 为我的扩展提供的内容。然后我去使用 MyTokenTagProvider 为我创建一个标记器。在这里我使用这个强大的东西叫做 Moq创建 ITextBuffer 对象的 Mock,这是 CreateTagger 的预期输入参数。

现在我们有了一个标注器,剩下的就是用它来检查它是否在做这项工作。 GetTags 是我想在这里测试的核心方法,因为它会接受我的输入查询并输出它能够识别的一系列标签。为了获得实际的单词,我们检查每个标签的跨度并使用它从原始查询中提取单词。 NUnit 的 CollectionAssert 方法将确保输出的单词列表与预期列表匹配。

希望这对其他创建和测试 VS 编辑器扩展的人有用。

关于visual-studio-2010 - 如何对 Ook 语言集成示例进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7676880/

相关文章:

visual-studio - 同名配置已存在

c++ - 基类未定义 Visual Studio 2010

visual-studio-code - 在 Visual Studio Code 之上开发应用程序

plugins - IntelliJ(使用 gradle): Can't find Kotlin plugin even though it's installed

.net - 覆盖 MEF 组合

c++ - 如何从输入文件输出十六进制数据

c# - 根据下拉列表在 asp.net 中选择的选项从文件夹动态加载多个图像

plugins - 按用户过滤 SONAR 代码违规

c# - 如何在 STA 线程上与 Bootstrapper 同时运行动画 SplashScreen

visual-studio-2010 - 有没有办法隐藏 VS2010 MEF 扩展中的代码?