团队基础服务自动构建和测试数据库错误

问题描述:

我想在团队基础服务上设置自动化构建和测试,并且无法连接到我的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: CREATE DATABASE 权限在数据库'master'中被拒绝。

在与数据库第一EF项目:

试验方法tfstest4.Tests.Controllers.HomeControllerTest.Index抛出 异常:System.InvalidOperationException:命名为 'TestDbContext' 没有连接字符串 可以发现在应用程序配置文件中。

(请注意,在连接字符串确实存在,而且它本地工作得很好,它部署到Azure中后)

在需要访问数据库上的Team Foundation服务运行单元测试任何意见是多少赞赏。

+0

并且本地连接字符串(web.config/web.debug.config)指向本地数据库(SQL Express /(local))或Azure DB? – astaykov 2013-02-25 09:39:08

+1

您是否在测试项目中检查了app.config文件以验证连接字符串是否正确。 – Chandermani 2013-02-25 11:24:51

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

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

如果使用EF Code First,则可以将连接字符串作为参数提供给DbContext类的基础构造函数。例如,你可以把你的连接字符串转换成静态属性,并在应用程序启动和测试实例化时,你的数据库的上下文

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

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

现在,在某些时候设置程序,您可以设置连接字符串获取它。这使您可以控制使用哪个连接字符串。

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

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

在您的测试类,你可以做完全不同的事情

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

最后,有可能是需要整理出一些防火墙的怪癖,因为你可能需要在添加例外运行测试的计算机的SQL Azure服务器防火墙。如果事实证明有必要,我会联系MS支持部门。

+0

解决当前技术问题的重要部分是注意到连接字符串在我的测试项目中不存在。我一直在本地测试,并没有意识到测试项目有一个单独的app.config文件。将我的连接字符串从app.config复制到web.config,使测试在我的Team Foundation Service构建中运行。 从我的测试中删除数据库依赖关系的一般建议也很好,我也将对此进行处理。 – Cruiser 2013-02-25 20:41:16