1

我目前正在创建一个使用 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);
        }

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

4

2 回答 2

2

在测试项目中,您可以使用覆盖 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。

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

于 2012-05-29T12:46:22.027 回答
1

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

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 
    }
}
于 2012-05-29T13:01:59.047 回答