C# Visual Studio单元测试和命令行参数,以避免源代码管理中的密码

C# Visual Studio单元测试和命令行参数,以避免源代码管理中的密码,c#,unit-testing,visual-studio-2013,C#,Unit Testing,Visual Studio 2013,我正在尝试测试我登录API的能力。当然,这意味着我需要我的测试类来访问我的用户名和密码。然而,我想把这个项目放在公共源代码管理上,所以我不能在代码中共享我的用户名和密码(人们可以想象得到)。我会使用命令行参数,因为它们存储在.user文件中(可以不受源代码控制,而不会破坏其他用户的项目)。然而,这些似乎并没有真正传递给测试类(至少,当我使用Environment.GetCommandLineArgs()时,我看不到它们)。那么,如何在本地存储密码而不破坏其他用户的项目?有办法吗?一种常见的方法如

我正在尝试测试我登录API的能力。当然,这意味着我需要我的测试类来访问我的用户名和密码。然而,我想把这个项目放在公共源代码管理上,所以我不能在代码中共享我的用户名和密码(人们可以想象得到)。我会使用命令行参数,因为它们存储在.user文件中(可以不受源代码控制,而不会破坏其他用户的项目)。然而,这些似乎并没有真正传递给测试类(至少,当我使用
Environment.GetCommandLineArgs()
时,我看不到它们)。那么,如何在本地存储密码而不破坏其他用户的项目?有办法吗?

一种常见的方法如下:

  • 将模板文件添加到项目中,其内容与要存储这些内容的文件相同,只是没有实际值。将空值或伪值放置在其位置
  • 将此模板文件添加到源代码管理
  • 从源代码管理中删除必须包含实际值的文件,并要求其忽略此文件的未来副本但是,不要将其从项目中删除
  • 添加包含如下命令的预生成事件:

    IF NOT EXIST "$(ProjectDir)\App.config" COPY "$(ProjectDir)\App-template.config" "$(ProjectDir)\App.config"
    
  • 这现在具有以下效果:

  • 配置文件的模板现在处于源代码管理中,没有敏感信息
  • 当您克隆或签出项目的新副本时,磁盘上存储敏感信息的实际文件将丢失,Visual Studio将对其进行标记,忽略此项
  • 进行构建时,这将执行上面的命令,有效地检查实际文件是否存在,然后从模板文件复制一个新副本
  • 编辑新创建的实际文件,添加敏感信息
  • 做另一个构建
  • 运行单元测试或程序
  • 要使此方法起作用,您必须要求源代码管理工具忽略磁盘上甚至项目本身中存在的文件,以便在您修改后不会自动将其添加到提交中

  • 将敏感信息(密码)放入单独的“SensitiveInfo.config”文件中

    
    
  • 敏感.info
    “复制到输出目录”设置为“始终复制”

  • 将此添加到“App.Config”:

  • 确保通过将“SensitiveInfo.config”文件添加到.hgignore(Mercurial)或.gitignore(Git)中来“ingnore”该文件


  • 为什么不在签入之前清除敏感数据的配置文件呢?有更好的方法来处理这类事情,请参阅我的答案了解其中一种方法。拥有一个必须记住要编辑掉敏感信息的文件会导致“灾难”(取决于这些信息最终在源代码管理中的糟糕程度)。它将被遗忘。
    <?xml version="1.0" encoding="utf-8"?>
    <appSettings>   
       <add key="SecretPassword" value="87DFG8S7G9S8G98SDFGHSDFG978DA" />
    </appSettings>