Team Foundation Service自动构建和测试数据库错误

时间:2013-02-25 05:12:32

标签: azure azure-devops

我正在尝试在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扔了   exception:System.Data.SqlClient.SqlException:CREATE DATABASE   数据库'master'中的权限被拒绝。

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

  

测试方法tfstest4.Tests.Controllers.HomeControllerTest.Index扔了   exception:System.InvalidOperationException:没有连接字符串   可以在应用程序配置文件中找到名为“TestDbContext”的文件。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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。