演练:使用单元测试验证 SharePoint 代码

利用单元测试,您可以更准确地调试和检查代码的操作。 此演练演示如何将单元测试合并到 SharePoint 应用程序中。 尽管本演练使用的是一个特定的 SharePoint 项目类型,但任何类型的 SharePoint 代码项目均可通过单元测试进行测试。

首先创建一个包含列表实例和事件接收器的标准列表定义项目,然后将一个单元测试添加到向 SharePoint 添加公告列表的事件接收器代码。 创建公告将导致事件接收器修改该公告。 单元测试将检查公告是否按预期方式修改,然后回报结果。

本演练阐释了以下任务:

  • 使用“列表定义”项目模板创建一个包含列表实例的列表定义。

  • 使用“事件接收器”项目模板创建一个事件接收器。

  • 使用代码添加并修改列表元素。

  • 向 SharePoint 项目添加一个单元测试。

  • 对 SharePoint 项目运行单元测试。

  • 查看和解释单元测试结果。

    提示

    以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 您安装的 Visual Studio 版本以及使用的设置决定了这些元素。 有关更多信息,请参见 使用设置

系统必备

您需要以下组件来完成本演练:

  • 支持的 Microsoft Windows 和 SharePoint 版本。 有关更多信息,请参见开发 SharePoint 解决方案的要求

  • Visual Studio 2010 专业版、Visual Studio 2010 高级专业版 或 Visual Studio 2010 旗舰版。

创建列表定义项目

首先,创建一个包含列表实例的列表定义项目。

创建列表定义项目

  1. 使用**“以管理员身份运行”**选项启动 Visual Studio 2010。

  2. 在**“文件”菜单上指向“新建”,再单击“项目”。 此时将出现“新建项目”**对话框。

  3. 在**“新建项目”对话框的顶部,选择下拉列表中的“.NET Framework 3.5”**。

  4. 在**“新建项目”对话框中,展开要使用的语言下的“SharePoint”节点,然后选择“2010”**节点。

  5. 在**“模板”窗格中,选择“列表定义”,然后单击“确定”**。

    这将显示**“SharePoint 自定义向导”**。 使用默认项目名称 ListDefinitionProject1。 使用此向导可以选择用于调试项目的站点以及解决方案的信任级别。

  6. 选择**“部署为场解决方案”,然后单击“下一步”**。 ALM 功能只能用于场解决方案。

  7. 在**“选择列表定义设置”窗口中,单击“完成”**接受默认值。 这将创建一个公告列表定义,并向 SharePoint 添加该列表的实例。

向列表定义添加事件接收器

通过向列表定义添加事件接收器,您可以响应对列表定义所做的更改。

向项目添加事件接收器

  1. 在解决方案资源管理器中单击列表定义。

  2. 在**“项目”菜单上,单击“添加新项”**。

  3. 在**“添加新项”对话框的“已安装的模板”窗格中,展开“SharePoint”节点,然后单击“2010”**。

  4. 在 SharePoint 模板的列表中,选择**“事件接收器”,然后单击“添加”**。 使用默认项目项名称 EventReceiver1。

  5. 在**“选择事件接收器设置”**窗口中,将事件接收器类型设置为“列表项事件”并使用默认事件源。

  6. 在**“处理以下事件”列表中,选中“正在添加项”,然后单击“完成”**。 这将创建一个在创建公告时将触发的事件处理程序。

  7. 用以下代码替换 EventReceiver1 类的 ItemAdding 方法。

    Public Overrides Sub ItemAdding(properties As SPItemEventProperties)
        properties.AfterProperties("Body") = "Note added by event receiver"
        MyBase.ItemAdding(properties)
    End Sub
    
    public override void ItemAdding(SPItemEventProperties properties)
    {
        properties.AfterProperties["Body"] = "Note added by event receiver"; 
        base.ItemAdding(properties);
    }
    
  8. 在 properties.AfterProperties 行上添加断点。 此断点将在稍后测试事件接收器时使用。

  9. 生成项目。

向事件接收器添加单元测试

若要测试事件接收器是否正常运行,应向它添加一个单元测试。

向事件接收器添加单元测试

  1. 在**“测试”菜单上,单击“新建测试”。 随即出现“添加新测试”**对话框。

  2. 在**“模板”中,单击“单元测试向导”**。

  3. 在**“添加到测试项目”下拉列表中,选择“创建新的 Visual C# 测试项目”“创建新的 Visual Basic 测试项目”,然后单击“确定”**。 在本示例中,请使用默认测试项目名称 TestProject1。

  4. 下一个窗口将显示列表定义项目的树视图。 展开树视图中的节点,直至您看到 ItemAdding 方法。

  5. 选中 ItemAdding 方法旁边的复选框,然后单击**“确定”**。

    这将创建一个名为 TestProject1 的新项目,其中包含名为 EventReceiver1Test 的代码模块。 该代码模块包含方法 ItemAddingTest,该方法可用于测试对应的 ItemAdding 方法。

  6. 在解决方案资源管理器中突出显示测试项目,然后单击**“视图”菜单上的“属性页”**。

  7. 在测试项目的属性页中,单击**“应用程序”选项卡,然后选择“目标框架”下拉列表中的“.NET Framework 3.5”**。

    将显示**“目标框架更改”对话框,并询问您是否要更改目标框架。 单击“是”**。 这将确保测试项目使用的 .NET Framework 版本与 SharePoint 项目使用的 .NET Framework 版本匹配。

  8. 将以下代码添加到 EventReceiver1Test 类的顶部。

    ' SharePoint site/subsite.
    Private siteUrl As String = "https://localhost"
    Private webUrl As String = "/"
    
    // SharePoint site/subsite.
    private string siteUrl = "https://localhost";
    private string webUrl = "/";
    
  9. 用下面的代码替换 ItemAddingTest 方法。

    <TestMethod()> _
    Public Sub ItemAddingTest()
        Try
            Using site As New SPSite(siteUrl)
                Using web As SPWeb = site.OpenWeb(webUrl)
                    ' Reference the list instance.
                    Dim mySite As SPList = web.Lists("ListDefinitionProject1 - ListInstance1")
    
                    ' Add a new announcement to the Announcements list.
                    Dim listItems As SPListItemCollection = mySite.Items
                    Dim item As SPListItem = listItems.Add()
                    item("Title") = "A Unit Test Announcement"
                    item("Expires") = "1/1/2099"
                    item.Update()
    
                    ' Test whether the event receiver added the text to the announcement.
                    Dim existingItem As SPListItem = listItems(0)
                    Assert.AreEqual(existingItem("Body").ToString().Contains("Note added by event receiver"), True, "Body passed!")
                End Using
    
            End Using
    
        Catch e As Exception
            Console.WriteLine("Error: " & e.ToString())
        End Try
    End Sub
    
    public void ItemAddingTest()
    {
        try
        {
            using (SPSite site = new SPSite(siteUrl))
            {
                using (SPWeb web = site.OpenWeb(webUrl))
                {
                    // Reference the list instance.
                    SPList mySite = web.Lists["ListDefinitionProject1 - ListInstance1"];
    
                    // Add a new announcement to the Announcements list.
                    SPListItemCollection listItems = mySite.Items;
                    SPListItem item = listItems.Add();
                    item["Title"] = "A Unit Test Announcement";
                    item["Expires"] = "1/1/2099";
                    item.Update();
    
                    // Test whether the event receiver added the text to the announcement.
                    SPListItem existingItem = listItems[0];
                    Assert.AreEqual(existingItem["Body"].ToString().Contains("Note added by event receiver"), true, "Test succeeded!");                                               
                }
            }
    
        }
    
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.ToString());
        }
    }
    

    此代码将打开 SharePoint 站点并添加新公告。 将新公告添加到 SharePoint 后,事件接收器中的代码将触发,从而向该公告添加注释。 单元测试中的代码通过调用 Assert.AreEqual 来检查事件接收器是否已将注释添加到公告中。

  10. 在解决方案资源管理器中选择 TestProject1,指向**“测试”菜单上的“编辑测试设置”,然后单击“本地(local.testsettings)”。 将出现“测试设置”**窗口。

  11. 在**“测试设置”窗口的左窗格中,单击“主机”,然后选择“在 32 或 64 位进程中运行测试”下拉列表中的“在 64 位计算机上的 64 位进程中运行测试”。 单击“应用”,再单击“关闭”**。

    此设置对于测试 SharePoint 应用程序是必需的,因为这些应用程序是 64 位的。

部署解决方案

创建 SharePoint 解决方案和单元测试后,部署 SharePoint 解决方案,然后更改启动项目。 单元测试要求在测试前将 SharePoint 项目放置在 SharePoint 服务器上,因此必须部署 SharePoint 项目。 部署项目后,将启动项目更改为单元测试以启用**“F5”**调试。

部署解决方案

  1. 单击**“生成”菜单上的“部署解决方案“**以部署 SharePoint 解决方案。

  2. 右击**“TestProject1”项目,然后选择“设为启动项目”**。

运行单元测试

现在,SharePoint 解决方案已部署到位而且单元测试已准备就绪,请运行单元测试以检查事件接收器是否可以正常工作。

运行单元测试

  1. 按**“F5”**运行测试项目。

    测试代码将在 SharePoint 站点上创建新的公告,从而触发事件接收器。

  2. 当遇到断点时,请按**“F5”**继续。

    事件接收器中的此行将向新公告添加注释。 然后,测试代码将检查公告中是否存在该注释。

  3. 将出现**“测试结果”**窗口,并指明 ItemAddingTest 已通过。 双击列表中的 ItemAddingTest 以查看测试详细信息。

    测试结果详细信息包括测试名称、开始和结束时间以及测试持续时间等信息。

请参见

概念

单元测试分析

针对现有代码创建并运行单元测试

使用 IntelliTrace 进行调试

其他资源

使用 ALM 功能验证和调试 SharePoint 代码

演练:使用 IntelliTrace 调试 SharePoint 应用程序