2013-04-06 37 views
2

我有大量的类都使用相同的接口。这是第一次这个代码将有单元测试,所以我试图想出最好的方式来生成所有这些测试,或者至少是类的结构。T4模板 - 从实现接口的类生成单元测试类

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

一旦完成,我可以用specfics填写每个单元测试类的细节。我显然必须删除T4文件,以免覆盖已添加到类中的代码,也许有办法做到这一点?

回答

3

看看一个这个博客帖子:

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

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

+1

该链接不再有效。 – 2017-01-24 09:33:33

+1

@AntonínProcházka,thx,FTFY – 2017-01-24 10:32:58

0

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

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

如果不够清楚,请告诉我,我会尽量提供一个例子。

+1

嗨,我不认为这是正确的。如果你看看EF context.tt文件,你会看到它通过 - fileManager.StartNewFile(entity.Name +“.cs”)生成许多单独的文件; 。我感谢你的意见,但我想我只需要通过上下文文件并从中学习。 – user1266921 2013-04-13 09:14:02

+0

@ user1266921您提到的是通过“EntityFrameworkTemplateFileManager”类实现的EF特定功能,如http://msdn.microsoft.com/en-us/library/ff477603.aspx中所述。所以如果你不介意EF参考,使用这也可能是一个解决方案。或者你当然可以自己实现一个类似的东西或者使用其他的实现。 T4的开箱即用行为是一个输出文件,其名称与模板名称相同,并由<#@ output #>指令指定,并且我建议的方法是恕我直言,这是实现您所需的最简单方法。 – famousgarkin 2013-04-13 15:20:10

0

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

我还将源类保留在公共子文件夹中。

虽然我只是开始设计模板是如何工作的,该模板将代码运行之前被编译,所以我的过程将是:

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

这是一些地方Roslyn可以以提取类和属性分析代码是有用的输出类名字,但我现在不会太花哨。我的方法将我们限制为每个文件一个类,并且只能使用我们正在编写的一种语言,但这是我们可以忍受的配置惯例。

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

相关问题