在生成的 C# 中进行动态单元测试的最佳方法 类

Best Approach for dynamic Unit testing in generated C# classes

我正在对代码生成器进行单元测试。单元测试的基本流程是:

  1. 单元测试调用适当的方法并生成代码。很简单。

  2. 单元测试编译生成的 c# 代码(步骤 #1)。如果代码编译成功,继续第 3 步,否则停止一切。

  3. 如果第 2 步成功,则单元测试会对第 2 步生成的编译代码运行其他预先编写的单元测试。为此,我将使用此处描述的解决方案:Running individual NUnit tests programmatically and NUnit API And Running Tests Programmatically

步骤 #2 的方法就是这个问题的内容:我想我有两个选择 (1) 运行 Visual Studio 命令行来编译解决方案或者 (2) 使用 带有 CompilerParameters 的 CSharpCodeProvider。如有任何建议,我们将不胜感激。

我个人每天都使用 Roslyn,所以我很想和 Kenneth 一起推荐它,但是,在你的情况下,如果你想知道的唯一信息是代码是否编译,我会倾向于更倾向于 CSharpCodeProvider class,特别是如果每​​个被单元测试的方法都生成一个代码文件。如果您必须对生成的代码进行任何类型的分析,或者如果您需要,则可能值得使用 Roslyn,但我怀疑这是您的情况。 Roslyn 唯一可能带给您的另一个好处是您可以直接 open up a whole project/solution 而不是尝试编译每个单独的文件,这可能会吸引您(它比您想象的要简单得多)。

除了这个建议,我只能说,如果你只需要在 CSharpCodeProvider 和命令行选项之间做出选择,我肯定会选择 CSharpCodeProvider,因为它已经包装并且公开与您的分析相关的数据和操作(是否有任何错误?=> 让我们检查一下 compiledResults.Errors.Count == 0)。你不需要调用外部进程(C# 编译器)来获得你想要的东西,这在我看来是一个更简单的选择,同时也有很大的灵活性(即 CompilerParameters

不知道你有没有开始玩,不过这个方法应该问题不大。希望这有帮助。