gpt4 book ai didi

c# - 将参数传递到 T4 模板内的单元测试中

转载 作者:行者123 更新时间:2023-11-30 23:07:56 24 4
gpt4 key购买 nike

我有以下名为 (MyTest.tt)T4 模板文件,其中 TestName(String) 和 MyAction(Action) 是参数。我可以将 lambda 操作传递到模板中吗?如何将数据传递到参数中?

<#@ template debug="false" hostspecific="false" language="C#" #>  
<#@ assembly name="System.Core" #>
<#@ assembly name="$(TargetPath)" #>
<#@ output extension=".Generated.cs" #>
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace Test.TestTemplate
{
[TestClass]
public class Test2
{
[TestMethod]
public void HAS_ACCESS_<#= "TestName" #>()
{
<#= MyAction.Invoke() #>
}
}
}

最佳答案

将参数注入(inject)模板可能不是那么容易。如果您从 visual studio 运行它们,我认为无法访问 t4 模板的执行上下文。它们可以以编程方式执行,但我从未这样做过。

如果您尝试使用参数化的 t4 模板,我现在可以想到几个选项。

选项 1 - 预定义您的数据:定义匿名类型的集合(只是为了更容易制作原型(prototype)),其中有两个字段用于测试名称和要在您的 t4 模板中调用的委托(delegate),然后它从集合中生成多个测试非常容易。

<#
// define the collection
var testCases = new [] {
new {name = "TestCase1", method = new Action(() => { /* your action body */ }) },
etc
};
#>

然后从测试用例数据生成测试。

<# foreach(var testCase in testCases) { #>
[TestMethod]
public void HAS_ACCESS_<#= testCase.name #> ()
{
<#= testCase.method() #>
}

<# } #>

选项 2 - 共享模板:您可以定义基本的 t4 模板,该模板可以包含在另一个模板中并从中执行。这可以是您的基本模板

 [TestClass]
public class Test2
{
[TestMethod]
public void HAS_ACCESS_<#= TestName #>()
{
<#= MyAction.Invoke() #>
}
}

请注意,使用 TestNameMyAction 是因为它们是模板中定义的变量。现在在第二个模板中,您可以执行以下操作

<#
string TestName = "TestCase1";
Action MyAction = () => { };
#>
<#@ include file="{Yor tempalte name.tt}" #>

其中“您的模板名称.tt”是之前定义的基础 t4 模板的实际名称。

通过这种方式,您可以定义多个 t4 模板,这些模板将使用提供的参数调用基本模板。

注意 - 注入(inject) dll: 如果您确实需要从现有的 dll 中调用预定义方法(您提到了 UICoded 方法),您可以将 dll 包含在您的模板,然后使用您需要的 dll。

<#@ assembly name="$(TargetDir)Mydll.dll" #>

<#@ assembly name="C:/..../Mydll.dll" #> 

当我需要从预定义数据生成多个测试时(当我知道我的测试用例但手工工作太多可以自动化时),我使用第一个选项

我在生成 C# 类时使用的第二个选项(不太适合生成单元测试)并且不希望所有这些都在一个文件中。

关于c# - 将参数传递到 T4 模板内的单元测试中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46852697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com