在nunit测试中使用connectionstring

时间:2010-07-02 08:39:38

标签: c# .net unit-testing nunit

我们使用nunit.exe应用程序来运行我们的(集成)测试

现在我遇到的问题是,从测试代码所在的dll中的app.config中没有获取connectionstring。

这听起来合乎逻辑,因为nunit.exe是启动应用程序,而不是测试dll(当我从Visual Studio testframework开始测试时,它曾经工作过),但我应该把连接字符串放在nunit中。 exe.config?

我尝试在testcode中设置它们(适用于appsettings:ConfigurationManager.AppSettings.Set("DownloadDirectory", mDir);),如下所示: ConfigurationManager.ConnectionStrings.Add(conset);(其中consetConnectionStringSettings个对象),但后来我得到了connectiontrings部分只读的错误。

如何在测试中使用连接线?

编辑: 我们使用实体框架,因此我们不能将连接字符串放在appsettings中,因为它直接从该部分读取,我找不到解决此问题的方法。

4 个答案:

答案 0 :(得分:6)

使用反射,您可以(在内存中)更改Configuration.ConnectionStrings [connectionName]的值,在您的情况下,您可能会在SetUp或TestFixtureSetUp中执行此操作。请参阅http://david.gardiner.net.au/2008/09/programmatically-setting.html

// Back up the existing connection string
ConnectionStringSettings connStringSettings = ConfigurationManager.ConnectionStrings[connectionName];
string oldConnectionString = connStringSettings.ConnectionString;

// Override the IsReadOnly method on the ConnectionStringsSection.
// This is something of a hack, but will work as long as Microsoft doesn't change the
// internals of the ConfigurationElement class.
FieldInfo fi = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(connStringSettings, false);

// Set the new connection string value
connStringSettings.ConnectionString = connectionStringNeededForNUnitTest;

答案 1 :(得分:2)

我意识到这不是您正在寻找的答案,但它是我用来解决同样问题的答案:

您至少可以在EF5和EF4.3中修改您的DbContext实现并添加一个接受硬编码连接字符串的构造函数,例如:

    public partial class MyContext : DbContext
    {
        public MyContext() : base("name=MyContext")
        {
        }
        // --- Here is the new thing:
        public MyContext(string entityConnectionString) : base(entityConnectionString)
        {
        }
        // --- New thing ends here

        // .... the rest of the dbcontext implementation follows below 
    } 

每次重新生成上下文时都需要粘贴这个东西,但恕我直言,这是值得的麻烦。连接字符串必须是使用您的元数据和所有内容格式化的实体框架,但您将能够弄清楚它。只需将它保存在某个地方,以便在必要时将其粘贴。

答案 2 :(得分:1)

您可以从ConfigurationManager.AppSettings读取连接字符串值,是的,它是只读的。您可以在App.Config中更改它。 如果要更改连接字符串中的某些值,对于ex URL,可以在代码中更改dataContext.URL或编码所需的任何属性。

答案 3 :(得分:0)

我认为单元测试可能很容易。您可以将连接字符串直接作为硬编码字符串放入测试类中。在简单的单元测试中,您测试有限的逻辑范围,而不是真正关注输入参数