【问题标题】:T4 Templates - Generates Unit Test classes from the classes which implement an interfaceT4 模板 - 从实现接口的类生成单元测试类
【发布时间】:2013-04-06 10:01:37
【问题描述】:

我有大量的类都使用相同的接口。这是这段代码第一次进行单元测试,所以我试图想出最好的方法来生成所有这些测试,或者至少是类的结构。

我知道 EF 中使用 T4 模板根据模型生成多个文件。有没有一种方法可以在 T4 模板中指定,我希望它查看所有实现接口的类并为每个类生成一个单元测试类。或者,如果它更容易,所有类都在同一个文件夹中,所以如果我可以将它指向那个文件夹,它可能会很好。

完成后,我可以使用规范填写每个单元测试类的详细信息。我显然必须删除 T4 文件,这样它就不会覆盖我添加到类中的代码,也许也有办法做到这一点?

【问题讨论】:

    标签: c# unit-testing templates visual-studio-2012 t4


    【解决方案1】:

    看看这篇博文:

    http://t4-editor.tangible-engineering.com/blog/how-to-generate-multiple-output-files-from-a-single-t4-template.html

    它应该使您能够使用单个 .tt 文件生成多个输出。我(几乎)以与您相同的方式使用它,我基于一个 xml 文件生成一大类方法(3000 行),然后生成另一个包含这些方法的单元测试的文件。具有讽刺意味的是,单元测试指出了我生成的大类中的几个错误,即使也生成了单元测试。

    【讨论】:

      【解决方案2】:

      T4 模板始终只生成一份输出,无论是设计时模板的一个输出文件还是运行时模板的一个字符串。因此,模板本身将无法为您生成多个文件。尽管如此,只需少量代码,您就可以多次使用单个运行时模板,根据需要创建多个输出。

      我建议创建一个与主项目分开的简单实用程序,其中将包含 T4 运行时模板和代码,例如,检查给定程序集或一堆给定源文件并使用生成适当的测试框架T4 运行时模板并将其保存到每个感兴趣的类的文件中。我想这取决于所讨论的类的数量,是否值得花一点时间来创建这样的工具。

      如果不够清楚,请告诉我,我会尝试提供示例。

      【讨论】:

      • 嗨,我不认为这是正确的。如果您查看 EF context.tt 文件,您会看到它通过 - fileManager.StartNewFile(entity.Name + ".cs"); 生成许多单独的文件; .不过,我很感谢您的意见,我想我只需要处理上下文文件并从中学习。
      • @user1266921 您提到的是通过EntityFrameworkTemplateFileManager 类实现的EF 特定功能,如此处msdn.microsoft.com/en-us/library/ff477603.aspx 所述。因此,如果您不介意 EF 参考,使用它也可能是一种解决方案。或者当然你可以自己实现类似的东西或使用其他一些实现。 T4 的开箱即用行为仍然是一个与模板同名的输出文件和由 指令指定的扩展名,我提出的方法是恕我直言,实现您所需要的最简单的方法.
      【解决方案3】:

      我正在一个新项目中做类似的事情,我想使用 T4 模板生成一些代码,这些代码与从特定类继承的所有类有关。 (基本上写一个工厂生成器类来为每个派生类创建一个新实例,只给定一个包含类名的字符串,并且在运行时不使用反射收集每个类中的公共属性列表。这样,其他开发人员可以只需将新类添加到项目中,而不必担心将其绑定到我们的框架中。)

      我还将源类保存在一个公共子文件夹中。

      虽然我才刚刚开始设计模板的工作方式,但模板会在代码编译之前运行,所以我的流程是:

      1. 对于子文件夹中的每个源代码文件:
        1. 将文件加载到内存中。
        2. 使用正则表达式验证文件中的类继承自所需的基类。
        3. 使用正则表达式提取我需要的数据。
      2. 使用我收集的数据(类名、公共属性名)编写输出类

      这是Roslyn 在分析代码以提取类和属性名称时可能有用的地方,但我暂时不会太花哨。我的方法将我们限制为每个文件一个类,并且只能使用我们正在编写的一种语言,但这是我们可以接受的约定优于配置。

      您可能会发现this MSDN article 以及Oleg Sych's blog and toolkit 很有用。 Oleg 的 T4 工具箱包含一个模板,用于从单个 T4 模板生成多个输出文件。

      【讨论】:

        猜你喜欢
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-28
        相关资源
        最近更新 更多