【问题标题】:Deployable database Test Methods可部署的数据库测试方法
【发布时间】:2012-05-29 12:40:17
【问题描述】:

我目前正在创建一个使用 sql CE 数据库的应用程序,我已经使这个数据库可以与应用程序一起部署,但是我现在遇到的问题是我需要运行 TestMethods 但这当它在调试或发布下的“testingProject”文件夹中找不到数据库时出错,因为它是数据目录

using (SqlCeConnection sqlCon = new SqlCeConnection(@"Data Source=|DataDirectory|\database.sdf;Persist Security Info=False;"))

上面的代码是我的连接字符串,所以我猜这意味着测试正在运行并在它自己的数据目录中搜索数据库

在不更改数据库连接字符串、数据库位置并且仍然让我的应用程序可部署的情况下我可以做什么的任何帮助?还是我在问一些不可能的事情?

编辑

[TestMethod]
        public void TestForReadingFromDB()
        {
            List<string> list = class.readDB();
            Assert.IsNotNull(list);
            Assert.AreNotEqual(0, list.Count);
        }

刚刚添加到当前失败的测试方法中

【问题讨论】:

  • 您如何初始化数据库并将数据植入其中以进行测试?
  • 我正在使用测试方法来测试我创建的 'class.readDB()' 方法,我知道数据库连接有效,我正在使用一切顺利的表单,主要问题是我的 TestClass 在哪里看到“DataDirectory”,因为我无法更改 class.readDB() 方法中的代码,如果有意义的话,它只是在“DataDirectory”中搜索数据库?

标签: c# database testing


【解决方案1】:

在测试项目中,您可以使用覆盖 DataDirectory 位置

AppDomain.CurrentDomain.SetData("DataDirectory", <PATH_TO_DATA_DIRECTORY>);

例如在我的 app.config 文件中我拥有的测试项目

  <appSettings>
    <add key="DataDirectory" value="..\..\Database"/>
  </appSettings>

在我的测试夹具基础中,我有:

var dataDirectory = ConfigurationManager.AppSettings["DataDirectory"];
var absoluteDataDirectory = Path.GetFullPath(dataDirectory);
AppDomain.CurrentDomain.SetData("DataDirectory", absoluteDataDirectory);

这会将 DataDirectory 设置为测试项目文件夹结构下的文件夹 /Database。

一旦我在其中删除或创建数据库副本,我就可以轻松运行集成测试。

【讨论】:

  • 那么您将如何将测试项目 DataDirectory 设置为指向另一个文件夹?只需更改为 ("DataDirectory", @"C:\...\NewFolder") ?
  • 当我尝试它错误地说缺少我上面评论的代码的源文件
  • 我不确定您为什么会遇到错误。我进行数据库测试的方式是在测试项目中有一个数据库副本和一个 app.config 文件
【解决方案2】:

这就是我在初始化数据类中指定用于测试的数据目录路径的方式

public class TestClasse
{
    public TestClass()
    {
         GetAppDataDirectoryForTesting();
    }

    private static string GetAppDataDirectoryForTesting()
    {   //NOTE: must be using visual studio test tools for this to work
        string path = AppDomain.CurrentDomain.BaseDirectory;
        var dirs = path.Split(Path.DirectorySeparatorChar);

        var appDataPath = "";
        for (int i = 0; i < dirs.Length - 3; i++)
        {
            appDataPath += dirs[i] + Path.DirectorySeparatorChar.ToString();
        }

        appDataPath = appDataPath + "[foldername(i.e. in my case project name)]" + Path.DirectorySeparatorChar.ToString() + "App_Data";
        return appDataPath;
    }


    [TestMethod]
    public void SomeTestMethod()
    {
        ....test code 
    }
}

【讨论】:

  • 这将返回到哪里?我的原始代码需要保持与上面第一行代码一样,但测试类需要调用包含该代码的方法并让它仍然查找并找到相同的数据库?
  • 在我的测试类中,我调用了我的初始化数据库类,它使用测试数据为数据库播种。在您的情况下,您可以将它放在测试类的顶部。我将尝试修改答案以显示这一点。您可能需要修改连接字符串。我使用的是 EF,所以它与直接 ado.net 有点不同
  • 我收到“没有可用于当前位置的源代码”错误,我猜它是您所说的使用 EF 对您做什么?在反汇编中,代码在 TestingClass.cs 中的“0000006a nop”处停止
  • 可能。我猜您的 app_data 文件夹实际上也在另一个项目中。尝试硬编码绝对路径,而不是像我的代码给出的相对路径。如果这不起作用,请尝试将 app.config 文件添加到您的测试项目并在那里加载您的连接字符串。不确定它是否会起作用,但值得一试。
猜你喜欢
  • 2016-01-31
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2018-04-04
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多