装箱百万奖金,第六届全国工业互联网数据创新应用大赛火热报名中! 了解详情
写点什么

使用编码招式(Coding Katas)、BDD 和 VS2010 项目模板:第 III 部分

我很优秀,但我能变得更好吗?

  • 2010-12-16
  • 本文字数:11422 字

    阅读完需:约 37 分钟

这是 Jamie Phillip 探索编码招式和行为驱动开发的第三部分,也是最后一部分。第一部分介绍了编码招式,第二部分结合应用了行为驱动开发

我很优秀,但我能变得更好吗?

第 III 部分:Visual Studio 2010 项目模板向导

通过编码招式和行为驱动开发,我受到了一些启迪,感觉良好。然而,当我意识到如果以后我就用这种方式编写单元测试、进行开发工作,那会相当痛苦,因为每次都要引入 Eric Lee 的 ContextSpecification。如果我可以简单地选定一个 BDD 的单元测试项目,然后项目创建后我就拥有了所有项目所需的文件,那就容易多了。稍作查询之后,我找到了一些项目模板导出向导(Project Template Export Wizard)的参考资料,似乎这就是最适合我的解决方案。

为了能试试这个例子,你要从 Visual Studio Gallery 上下载并安装 Export Template Wizard(在 Gallery 站点上查询 Export Template Wizard)。这是一个微软免费的 Visual Studio 扩展,可以将一个现有的项目导出成项目模板。

在我们创建第一个模板前,先看看一些已有的模板,了解一下我们可能需要什么,这对我们来说是很重要的。

安装好 Visual Studio 后,它的模板位于以下目录:

  • \VisualStudioInstallationDirectory\Common7\IDE\ItemTemplates\Language\Locale\
  • \VisualStudioInstallationDirectory\Common7\IDE\ProjectTemplates\Language\Locale\

例如,下面这个目录包含了英文版 Visual Studio 的项目模板:

  • C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\1033\

此外,当你安装一个模板的时候(通常通过双击.vsix 文件——微软 Visual Studio 扩展文件),它会被安装到以下文件夹:

  • \User Documents and Settings Directory\Local Settings\Application Data\Microsoft\VisualStudio\10.0\Extensions

模板提示:

使用注册表编辑器,查看以下键,你会看到所有已安装的 Visual Studio 2010 扩展:

HKCU\Software\Microsoft\VisualStudio\10.0\ExtensionManager\EnabledExtensions

Visual Studio 启动时会自动更新这里的注册项。如果我们删除掉某个扩展(比如,删除某个扩展的目录),Visual Studio 下次启动时会更新注册表中的有关项。

你会看到,所有模板的内容都存储在 ZIP 文件中,这有助于有条理地“把所有东西都放在一起”。当你检查这些 ZIP 文件时,你会注意到它们至少都包含一个.vstemplate 文件,可以认为这就是模板的配置文件。

考虑到我们的目的,我们对 BasicUnitTest 模板中的内容有所兴趣,此模板位于:

C:\Program Files\Microsoft Visual Studio 10.0\Common7

  • \IDE\ItemTemplates\CSharp\1033\BasicUnitTest.zip

查看 VS 2010 中的现有模板时,会注意到在代码文件中(比如 AssemblyInfo.cs),有一些特殊的关键字。在下面的代码示例中,高亮显示的文本说明了不同的模板参数关键字:

复制代码
<span color="#0000ff">using</span> System;
<span color="#0000ff">using</span> System.Text;
<span color="#0000ff">using</span> System.Collections.Generic;
$<span color="#0000ff">if</span>$ ($targetframeworkversion$ == 3.5)<span color="#0000ff">using</span> System.Linq;$endif$
$<span color="#0000ff">if</span>$ ($targetframeworkversion$ == 4.0)<span color="#0000ff">using</span> System.Linq;$endif$
<span color="#0000ff">using</span> Microsoft.VisualStudio.TestTools.UnitTesting;
 
<span color="#0000ff">namespace</span> <span> $rootnamespace$</span>
{
           [TestClass]
           <span color="#0000ff">public class</span> <span>$safeitemname$</span>
           {
                     [TestMethod]
                     <span color="#0000ff">public void</span> TestMethod1()
                     {
                     }
           }
}

关键字 $rootnamespace$、$safeitemname$ 以及 $safeprojectname$ 是保留的模板参数:

参数

描述

$rootnamespace$

当前项目的根命名空间。 在项目中添加新项时,此参数用来替换命名空间。

$safeprojectname$

在新建项目对话框中,用户输入的项目名(所有不安全的字符以及空格都会被移除)。

$safeitemname$

在添加新项对话框中,用户输入的名称(所有不安全的字符以及空格都会被移除)。

查看关联的.vstemplate 文件,我们可以看到引用代码文件的地方在 ProjectItem 元素里,而且 ReplaceParameters 属性的值被设置为 true:

复制代码
  <span color="#0000ff"><</span><span color="#800000">TemplateContent</span><span color="#0000ff">></span>
     ...
     <b><</b><b><span color="#800000">ProjectItem</span></b><b> </b><b><span color="#ff0000">ReplaceParameters</span></b><b><span color="#0000ff">=</span></b><b>"<span color="#0000ff">true</span>"<span color="#0000ff">></span>UnitTest.cs<span color="#0000ff"></</span>ProjectItem<span color="#0000ff">></span></b>
   <span color="#0000ff"></</span><span color="#800000">TemplateContent</span><span color="#0000ff">></span>

有了这些信息,模板向导就可以在指定文件中有效地搜索并替换所有的参数;如上例中的 UnitTest.cs 文件。简单地在.vstemplate 文件中增加一个 CustomParameter 元素,就可以使用自定义参数了:

复制代码
<span color="#0000ff"><</span><span color="#800000">TemplateContent</span><span color="#0000ff">></span>
    ...
    <span color="#0000ff"><</span><span color="#800000">CustomParameters</span><span color="#0000ff">></span>
      <<span color="#800000">CustomParameter</span> <span color="#ff0000">Name</span><span color="#0000ff">="$TemplateParameter1$" <span color="#ff0000">Value</span>="SomeValue"/></span>
        <<span color="#800000">CustomParameter</span> <span color="#ff0000">Name</span><span color="#0000ff">="$TemplateParameter2$" <span color="#ff0000">Value</span>="SomeOtherValue"/></span>
      <span color="#0000ff"></</span><span color="#800000">CustomParameters</span><span color="#0000ff">></span>
  <span color="#0000ff"></</span><span color="#800000">TemplateContent</span><span color="#0000ff">></span>

有了这些知识,我们可以把那些零散的东西放到一起,创建我们的 BDD 单元测试模板。

  1. 首先,我们要创建一个新项目,作为我们新项目模板的基础。根据我们的目的,最佳选项是单元测试项目:

创建好这个项目后,我们就有了构建新模板的基础(当然,这种方法适用于所有的项目类型,不光是单元测试项目)。
2. 记住,制作新的项目模板时,该项目中所有的东西都会被包括进去,因此现在我们可以引入所有所需的代码文件了(在我的例子中,是来自 Eric Lee 的 ContextSpecification.cs):
3. 添加所需的程序集引用作为我们项目模板的一部分,在我的例子中,我想使用 MSpec 程序集:

模板提示:

需要特别注意的是,在部署这个模板的机器上,需要安装上相同的程序集;因此你应该把引用限制在.NET framework 提供的程序集上,或者在 GAC 中的程序集。这或许意味着,作为你模板的一部分,你必须创建一个安装程序,以便将某些程序集安装到 GAC 中——或者要求用户自行安装所需的程序集。

  1. 我们要使用适当的模板参数(先前我们查阅过的 $safeprojectname$)来替换代码文件中出现的命名空间名。同时,我在引用 System.Linq 的地方,放上了“版本保镖”(译注:只在指定版本的.NET Framework 上输出代码块): ```
    using System;
    using System.Text;
    using System.Collections.Generic;
    $if$ ($targetframeworkversion$ == 3.5)using System.Linq;$endif$$if$ ($targetframeworkversion$ == 4.0)

using System.Linq;$endif$
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace $safeprojectname$
{

}

复制代码
5. 由于我们将在我们的测试类中使用 ContextSpecification,我们要添加一个 using 声明,并使用适当的模板参数添加基类的定义(这里,我在后面加上了 Context 这个词,以此我们可以将它同派生测试类区别开来): ```
<span color="#0000ff">using</span> System;
<span color="#0000ff">using</span> System.Text;
<span color="#0000ff">using</span> System.Collections.Generic;
$<span color="#0000ff">if</span>$ ($targetframeworkversion$ == 3.5)<span color="#0000ff">using</span> System.Linq;$endif$$<span color="#0000ff">if</span>$ ($targetframeworkversion$ == 4.0)
<span color="#0000ff">using</span> System.Linq;
$endif$
<span color="#0000ff">using</span> Microsoft.VisualStudio.TestTools;
<span color="#0000ff">using</span> Microsoft.VisualStudio.TestTools.UnitTesting;
<span color="#0000ff">namespace</span> $safeprojectname$
{
<span color="#0000ff">public class</span> $safeitemname$Context : ContextSpecification
{
/// <summary>
/// <span color="#008000">The "Given some initial context" method</span>
/// </summary>
<span color="#0000ff">protected override void</span> Context()
{
<span color="#008000">// setup your class under test</span>
}
}
<span color="#0000ff">...</span>
}
  1. 下一步是重新定义代码文件中的测试类,让它继承于我们刚刚增加的 Context 基类。我在这里使用的代码,来自于本文先前描述的保龄球招式解决方案,并用合适的模板参数替换了类名和方法名: ```

    ///


    /// Summary description for $safeitemname$
    ///

    [TestClass]
    public class $safeitemname$ : $safeitemname$Context
    {
    ///

    复制代码
    /// <span color="#008000">The "When an event occurs" method</span>
    /// </summary>
    <span color="#0000ff">protected override void </span><span color="#000000">BecauseOf()<br></br></span> {
    <span color="#008000">//</span>
    <span color="#008000">//</span> <span color="#004080">TODO: Add behavior setup (Action) here</span>
    <span color="#008000">//</span>
    }
    /// <summary>
    /// <span color="#008000">The "then ensure some outcome" method.</span>
    /// </summary>
    [TestMethod]
    <span color="#0000ff">public void</span> TestMethod1()
    {
    <span color="#008000">//</span>
    <span color="#008000">//</span> <span color="#004080">TODO: Add test logic here</span>
    <span color="#008000">//</span>
    }

    }

复制代码
7. 对于文件 AssemblyInfo.cs,我们要针对我们创建的项目,替换其中的一些引用(比如程序集的名字等等),然而这次我们可以从现存的模板“定义” 中拷贝已有的 AssemblyInfo(我使用“C:\\Program Files\\Microsoft Visual Studio 10.0\\Common7\\IDE\\ProjectTemplates\\CSharp\\Test\\1033\\TestProject.zip”)到我们的项目中。 ```
<span color="#0000ff">using</span> System.Reflection;
<span color="#0000ff">using</span> System.Runtime.CompilerServices;
<span color="#0000ff">using</span> System.Runtime.InteropServices;
<span color="#008000">// General Information about an assembly is controlled through the following <br></br>// set of attributes. Change these attribute values to modify the information<br></br>// associated with an assembly.<br></br></span>[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyTitle</span>(<span color="#ff0000">"$projectname$"</span>)]
[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyDescription</span>(<span color="#ff0000">""</span>)]
[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyConfiguration</span>(<span color="#ff0000">""</span>)]
[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyCompany</span>(<span color="#ff0000">"$registeredorganization$"</span>)]
[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyProduct</span>(<span color="#ff0000">"$projectname$"</span>)]
[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyCopyright</span>(<span color="#ff0000">"Copyright ?? $registeredorganization$ $year$"</span>)]
[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyTrademark</span>(<span color="#ff0000">""</span>)]
[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyCulture</span>(<span color="#ff0000">""</span>)] 
<span color="#008000">// Setting ComVisible to false makes the types in this assembly not visible <br></br>// to COM components.  If you need to access a type in this assembly from <br></br>// COM, set the ComVisible attribute to true on that type.<br></br></span>[<span color="#0000ff">assembly</span>: <span color="#0080ff">ComVisible</span>(<span color="#0000ff">false</span>)] 
<span color="#008000">// The following GUID is for the ID of the typelib if this project is exposed to COM<br></br></span>[<span color="#0000ff">assembly</span>: <span color="#0080ff">Guid</span><span color="#ff0000">("$guid1$"</span>)] 
<span color="#008000">// Version information for an assembly consists of the following four values:<br></br>//<br></br>//      Major Version<br></br>//      Minor Version <br></br>//      Build Number<br></br>//      Revision<br></br>//<br></br>// You can specify all the values or you can default the Build and Revision Numbers <br></br>// by using the '*' as shown below:</span>
[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyVersion</span><span color="#ff0000">("1.0.0.0"</span>)]
[<span color="#0000ff">assembly</span>: <span color="#0080ff">AssemblyFileVersion</span>(<span color="#ff0000">"1.0.0.0"</span>)]
  1. 现在我们准备运行 Template Export Wizard,选择文件 -> 将模板导出为 VSIX…:
  2. 这会打开“将模板导出为 VSIX”向导对话框,在这个对话框里,我们可以选择创建一个项目模板(从解决方案中的项目),或者创建一个新项模板(从所选项目或解决方案中的某个文件)——为了导出一个项目模板,我们选择解决方案中唯一的项目。单击下一步 >:
  3. 在向导的下一个界面里,我们可以设置在 Visual Studio 的“新建项目”对话框中,如何显示这个模板。适当填写一些字段并单击下一步 >:

模板提示:

假如不填写“图标图片”和“预览图片”这两个字段,向导会自动帮你生成图片,你可能会不喜欢这些图片(看起来像代码窗口的快照——缩小了的)。建议你创建你自己的图片,并在这两个字段中引用你的图片。
在本例中,我准备了下面这种尺寸的图片(大小与向导生成的图片一致):


  1. 在下一个窗口里,填写好“产品细节”,我们就完成了所有选项。尤其需要注意模板的输出目录,以及对话框底下的两个复选框。
    当你单击完成按钮的时候,VSIX 文件会生成到输出目录。
    复选框“自动将模板导入 Visual Studio”会指示向导是否在导出模板后安装模板——取决于你想如何创建你的模板, 你可以酌情考虑是否勾选上这一项。眼下我让它勾选上,因为我想马上看到结果。
    如果你没有记下输出路径,那就有必要勾选上“在资源管理器窗口中显示输出文件目录”——我个人喜欢选上这一项。填写相应的字段并单击完成:
  2. 一旦完成这个过程,打开新建项目对话框(要么通过菜单文件 -> 新建 -> 项目,要么通过按下 CTRL + Shift + N)并选择 Visual C#项目类型,你会找到新建的 BDD Unit Test 项目:
  3. 创建一个 BDD Unit Test 类型的项目,并打开 UnitTest1.cs 文件。你会发现从类名继承的模板参数(unittest1Context and unittest1)是小写的,在我看来这不太理想: ```
    using System;
    using System.Text;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.VisualStudio.TestTools;
    using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BDDUnitTest1
{
     public class unittest1Context : ContextSpecification

     {
        
     }
 
     ///

/// Summary description for unittest1

     ///


TestClass
public classunittest1 : unittest1Context


     }
}

复制代码
14. 回顾一下 Visual Studio 扩展文件(.vsix)的格式,我们可以将项目模板导出向导生成的文件重新命名成.ZIP 文件:
15. 打开这个 ZIP 文件,我们会看到以下这种结构;内部的 zip 文件(在下面例子中是 - BddUnitTest.zip)是我们所关心的,因此在合适的位置解压缩重命名的 zip 文件:
16. 解压缩所有的相应的 ZIP 文件,使用 Visual Studio“以…方式打开”的功能打开.vstemplate 文件(当提示编辑器类型时选择 XML(文本)编辑器): ![](https://static001.infoq.cn/resource/image/3d/70/3d7fd6628d1dc30c7c814a239de69c70.jpg)
![](https://static001.infoq.cn/resource/image/a7/13/a7005afbd5b6671fcfa86e75525c9f13.jpg)
17. 在 Visual Studio 的 XML 编辑器中打开.vstemplate 文件,你会注意到每个文件对应的 ProjectItem 元素的 TargetFileName 属性都是小写的,尽管实际的文件名使用的是骆驼命名法: ```
<span color="#0000ff"><?xml version="1.0"?><br></br><<span color="#800000">VSTemplate</span> <span color="#ff0000">xmlns:xsi</span>="http://www.w3.org/2001/XMLSchema-</span>
<span color="#0000ff">instance</span>" <span color="#ff0000">xmlns:xsd</span>="<span color="#0000ff">http://www.w3.org/2001/XMLSchema"<span color="#ff0000">Type</span>="Project" <span color="#ff0000">Version</span>="3.0.0" <span color="#ff0000">xmlns</span>="http://sc</span>
<span color="#0000ff">hemas.microsoft.com/developer/vstemplate/2005"><br></br></span>   <span color="#0000ff"><<span color="#800000">TemplateData</span>><br></br>     <<span color="#800000">Name</span>><span color="#000000">BDD Unit Test</span></<span color="#800000">Name</span>><br></br>     <<span color="#800000">Description</span>><span color="#000000">A Test project based on Behavior Driven Development (BDD) principles</span></<span color="#800000">Description</span>><br></br>     <<span color="#800000">Icon</span><span color="#000000">>__Template_small.png</span></<span color="#800000">Icon</span>><br></br>     <<span color="#800000">PreviewImage</span><span color="#000000">>__Template_large.png</span></<span color="#800000">PreviewImage</span>><br></br>     <<span color="#800000">ProjectType</span>><span color="#000000">CSharp</span></<span color="#800000">ProjectType</span>><br></br>     <<span color="#800000">ProjectSubType</span> /><br></br>     <<span color="#800000">SortOrder</span>><span color="#000000">1000</span></<span color="#800000">SortOrder</span>><br></br>     <<span color="#800000">DefaultName</span>><span color="#000000">BDDUnitTest</span></<span color="#800000">DefaultName</span>><br></br>     <<span color="#800000">ProvideDefaultName</span>><span color="#000000">true</span></<span color="#800000">ProvideDefaultName</span>><br></br>     <<span color="#800000">EnableLocationBrowseButton</span>><span color="#000000">true</span></<span color="#800000">EnableLocationBrowseButton</span>><br></br>     <<span color="#804040">LocationField</span>><span color="#000000">Enabled</span></<span color="#800000">LocationField</span>><br></br>   </<span color="#800000">TemplateData</span>><br></br>   <<span color="#800000">TemplateContent</span>><br></br>     <<span color="#800000">Project</span> <span color="#ff0000">File</span>="BddUnitTest.csproj" <span color="#ff0000">TargetFileName</span>="BddUnitTest.csproj" <span color="#ff0000">ReplaceParameters</span>="true"><br></br>       <<span color="#800000">ProjectItem</span> <br></br>         <span color="#ff0000">TargetFileName</span>="<span>contextspecification.cs</span>" <br></br>         <span color="#ff0000">ReplaceParameters</span>="true">contextspecification.cs</<span color="#800000">ProjectItem</span>><br></br>       <<span color="#800000">ProjectItem</span> <br></br>         <span color="#ff0000">TargetFileName</span>="<span>assemblyinfo.cs</span>" <br></br>         <span color="#ff0000">ReplaceParameters</span>="true">properties\assemblyinfo.cs</<span color="#800000">ProjectItem</span>><br></br>       <<span color="#800000">ProjectItem</span> <br></br>         <span color="#ff0000">TargetFileName</span>="<span>unittest1.cs</span>" <br></br>         <span color="#ff0000">ReplaceParameters</span>="true">unittest1.cs</<span color="#800000">ProjectItem</span>><br></br>     </<span color="#800000">Project</span>><br></br>     <<span color="#800000">CustomParameters</span> /><br></br>   </<span color="#800000">TemplateContent</span>></span>
<span color="#0000ff"></<span color="#800000">VSTemplate</span>></span>
  1. 仅仅更新下每个 ProjectItem 元素的 TargetFileName 属性,使用实际文件名的驼峰式大小写(没必要更新 ProjectItem 元素的文本部分,因为这不会影响向导在创建项目时如何生成文件): ```
    xml version="1.0"?>

    <VSTemplate xmlns:xsi=“ http://www.w3.org/2001/XMLSchema-
    instance” xmlns:xsd=“ http://www.w3.org/2001/XMLSchema Type=“Project” Version=“3.0.0” xmlns=" http://sc

hemas.microsoft.com/developer/vstemplate/2005">

  <TemplateData>



</TemplateData>

<TemplateContent>

     <Project File=“BddUnitTest.csproj” TargetFileName=“BddUnitTest.csproj” ReplaceParameters=“true”>

       <ProjectItem

         TargetFileName=“ContextSpecification.cs

         ReplaceParameters=“true”>contextspecification.cs</ProjectItem>

       <ProjectItem

         TargetFileName=“AssemblyInfo.cs

         ReplaceParameters=“true”>properties\assemblyinfo.cs</ProjectItem>

       <ProjectItem

         TargetFileName=“UnitTest1.cs

         ReplaceParameters=“true”>unittest1.cs</ProjectItem>

     </Project>

     <CustomParameters />

   </TemplateContent>

</VSTemplate>

复制代码
19. 下一步,重新按照解压缩的顺序对这些文件进行压缩,首先创建内部的 ZIP 文件,它包含更新过的.vstemplate 文件(在这个例子中就是 BddUnitTest.zip),然后把它放到属于它的文件夹里(与 ZIP 文件名同名): [![](https://static001.infoq.cn/resource/image/13/12/13a53c28bf639b6e1948677ac663f312.jpg)](http://www.infoq.com/resource/articles/BDD-Katas-3/en/resources/image14large.jpg)
20. 接着我们将其余文件压缩至最终的 ZIP 文件中,这个文件是“更新过的”Visual Studio 扩展文件(.vsix):
21. 将新建的 ZIP 文件重新命名为最初由导出向导创建的 vsix 文件(这里就是 BDD Unit Test.vsix): [![](https://static001.infoq.cn/resource/image/a1/27/a1d85e2ac654b38057f51961f98df327.jpg)](http://www.infoq.com/resource/articles/BDD-Katas-3/en/resources/image16large.jpg)
22. 关闭所有的 Visual Studio 2010 实例,转到文件夹\\User Documents and Settings Directory\\Local Settings\\Application Data\\Microsoft\\VisualStudio\\10.0\\Extensions,并删除原先由导出向导创建的相关扩展所在的目录(这里是 \\User Documents and Settings Directory\\Local Settings\\Application Data\\Microsoft\\VisualStudio\\10.0\\Extensions\\JasPWarE\\BDD Unit Test): [![](https://static001.infoq.cn/resource/image/95/dd/95227c0f683dceea1d8440510879b0dd.jpg)](http://www.infoq.com/resource/articles/BDD-Katas-3/en/resources/image17large.jpg)
23. 在 Windows 资源管理器中,转到新建的 vsix 文件(在这里是 BDD Unit Test.vsix)并双击它,这会打开 Visual Studio 扩展安装器: [![](https://static001.infoq.cn/resource/image/ed/99/ed9041616de6d5b062e8050d494a4299.jpg)](http://www.infoq.com/resource/articles/BDD-Katas-3/en/resources/image18large.jpg)
24. 单击安装,安装过程就会执行并安装更新过的模板: ![](https://static001.infoq.cn/resource/image/04/e1/040b82d1a59d11559d9830550fbef1e1.jpg)
25. 一旦安装好扩展,我们就可以启动 Visual Studio 2010,创建一个新的 BDD Unit Test 项目并检查代码文件,以此验证我们的更新是否正常工作: ```
<span color="#0000ff">using</span> System;
<span color="#0000ff">using</span> System.Text;
<span color="#0000ff">using</span> System.Collections.Generic;
<span color="#0000ff">using</span> System.Linq; 
<span color="#0000ff">using</span> Microsoft.VisualStudio.TestTools;
<span color="#0000ff">using</span> Microsoft.VisualStudio.TestTools.UnitTesting;
 
<span color="#0000ff">namespace</span> BDDUnitTest1
{
     <span color="#0000ff">public class</span> <span color="#0080ff">UnitTest1Context</span> : <span color="#0080ff">ContextSpecification</span>
     {
         <span color="#0000ff">...</span>
     }
 
     /// <summary>
     /// <span color="#008000">Summary description for UnitTest1<br></br></span>     /// </summary>
     [<span color="#0080ff">TestClass</span>]
     <span color="#0000ff">public class</span> <span color="#0080ff">UnitTest1 <span color="#000000">:</span> UnitTest1Context</span>
     {
         <span color="#0000ff">...</span>
     }
}

虽然在最后进行清理工作的时候,有一定量的人工介入,但这有助于揭露更新已有的.vsix 文件以及更改模板是多么容易。有了新的模板,创建 BDD 单元测试就容易多了,因为我们不用担心是否引用了正确的程序集或,或者是否包含了适当的代码文件。你仅需关注于编写实际的测试本身。

从编码招式到行为驱动开发再到项目模板的旅程,向我们展示了各种各样的实践练习,我们可以用它们在不同层次上提高自己。编码招式可以提高我们的编码技能;行为驱动开发可以提高我们做设计和编写单元测试的方法;项目模板可以改进我们创建代码项目的过程。

查看英文原文: Using Coding Katas, BDD and VS2010 Project Templates: Part 3


感谢陈宇对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2010-12-16 00:001809
用户头像

发布了 38 篇内容, 共 76939 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容
使用编码招式(Coding Katas)、BDD和VS2010项目模板:第III部分_敏捷_Jamie Phillips_InfoQ精选文章