我正在尝试在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上运行单元测试的任何建议。
答案 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。