1

我正在尝试在 Team Foundation Service 上设置自动构建和测试,但我无法让测试连接到我的 Azure 数据库,因此我的测试一直失败。

构建进行得很好,但是导致站点连接到我的数据库的任何测试都失败了。我在 Azure 上设置了我的数据库并将其与我的 Azure 站点相关联。我为数据库配置了允许的 IP 地址以包括我的本地计算机,并将其设置为允许 Azure 服务连接。该站点在我的机器上本地运行,并且在发布到我的 Azure 网站时也可以运行,并且可以从两个地方连接到 Azure 数据库。

我正在使用 Team Foundation Service ( https://tfs.visualstudio.com/ ) 进行源代码控制,并在 Team Foundation Service 中设置了自动构建,并从这些构建持续部署到 Azure。该工作的所有其他方面都很好,源代码控制,在签入时开始构建,构建部署到我的 Azure 站点,但我的测试都没有通过。

错误信息:

在代码优先 EF 的项目中:

测试方法 MySite.Tests.Controllers.HomeControllerTest.Index 抛出异常:System.Data.SqlClient.SqlException:数据库“master”中的 CREATE DATABASE 权限被拒绝。

在具有数据库优先 EF 的项目中:

测试方法 tfstest4.Tests.Controllers.HomeControllerTest.Index 抛出异常:System.InvalidOperationException:在应用程序配置文件中找不到名为“TestDbContext”的连接字符串。

(请注意,连接字符串确实存在,并且它在本地和部署到 Azure 后都可以正常工作)

非常感谢有关在需要访问数据库的 Team Foundation Service 上运行单元测试的任何建议。

4

1 回答 1

1

如果您正在运行自动化单元测试,我的建议是删除对数据库的任何依赖项,因为您没有理由测试实体框架。我个人会做的是将我的数据库层隐藏在某种形式的存储库接口后面,并在运行我的测试时提供一些模拟实现,使用某种形式的依赖注入策略或工厂模式。

如果您还在运行自动化集成测试,则涉及数据库可能更有意义。测试项目的配置中可能不存在您的连接字符串。我不确定你如何告诉 EF 使用哪个连接字符串,但我建议避免直接依赖于设置条目。

如果您使用 EF Code First,您可以将连接字符串作为参数提供给 DbContext 类的基本构造函数。例如,您可以将连接字符串放入静态属性中,并在实例化数据库上下文时获取它

public static class MyConnectionStringProvider
{
    public static string ConnectionString{ get; set; }
}

public class MyDbContext : DbContext
{
    public MyDbContext() 
       : base(MyConnectionStringProvider.ConnectionString)
    { }
}

现在,在您的应用程序启动和测试设置例程中的某个时刻,您可以设置连接字符串。这允许您控制要使用的连接字符串。

例如,如果您正在运行一个 azure 网站,您通常会在 Application_Start 方法中从角色配置而不是 app.config 文件中获取连接字符串。

MyConnectionStringProvider.ConnectionString = 
     RoleEnvironment.GetConfigurationSettingValue("MyConnectionString")

在你的测试课上,你可以做一些完全不同的事情

MyConnectionStringProvider.ConnectionString = "[connectionstring to my test database]"

最后,可能需要整理一些防火墙怪癖,因为您可能需要在 SQL Azure 服务器防火墙中为运行测试的计算机添加一个例外。如果有必要,我会就此联系 MS Support。

于 2013-02-25T12:16:23.883 回答