使用不同凭据运行NUnit集成测试

5
我正在使用C#,NUnit和SQL Server 2008 r2开发版数据库进行集成测试。设置我的fixture包括创建一个新的数据库并加载测试数据,因此我需要dbo特权。
然而,我希望以较低的权限运行测试。我有另一个可以验证的AD账户,我可以使用模仿运行一些T-SQL,如下所述:http://support.microsoft.com/?scid=306158
public static bool ExecuteFileAs(string fileName, string connectionString, 
                                  string user, string domain, string password)
{
    using(new Impersonator(user, domain, password))
    {
        using(var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            return SqlFileExecuter.RunSql(connection, fileName);
        }
    }
}

当我在这段代码片段内设置断点并启动分析器时,我可以看到另一个使用我提交的用户名打开的连接,因此模拟确实有效。 不幸的是,我无法在测试用例设置开始和结束时都进行身份模拟。在设置结束时,我执行以下操作:

        impersonator = new Impersonator("username", "DOMAIN", "pwd");

当第一个单元测试开始时,我遇到了以下错误,其中一个dll在测试中使用:System.IO.FileLoadException:无法加载文件或程序集'...'或其一个依赖项。拒绝访问。 我已经授予其他帐户对包含所有二进制文件的目录的完全访问权限,但并没有帮助。

欢迎任何建议。

编辑:我的工作站仍在运行XP操作系统。


1
你不能使用SQL身份验证而非受信任的连接,这有什么原因吗?这只需要你为测试的这部分更改连接字符串即可。此外,在使用模拟时,您可以将SQL数据加载到内存中,这样就不必访问磁盘以获取SQL执行器了。 - Travis
1
Travis,我的生产服务器目前没有使用混合模式身份验证,但我认为你的建议会奏效。你能把你的评论发布为答案吗,这样我就可以接受它了吗?谢谢。 - Arne Lund
你是否使用Windows身份验证得到了任何解决方案?标记的答案是关于使用SQL的。 - Kiquenet
2个回答

3

一个可能的解决方案是不使用Windows身份验证,而是使用SQL用户。这只需要更改连接字符串。

此外,如果错误与IO权限相关,则可以尝试在模拟用户之前执行所有IO操作。使用http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.server.aspx而不是SqlFileExecuter,您可以直接针对SQL Server执行T-SQL块(不像ADO.NET)。 SMO与您上面的方式略有不同...

var s = new Server(connectionString);
s.ConnectionContext.ExecuteNonQuery(@"CREATE DATABASE test; GO; Use test; ...");

1
目前,我切换到混合模式并且它可以工作。我接受了你的答案。当我有更多声望时,我会回来点赞。谢谢! - Arne Lund
如果不能使用 SQL 用户怎么办? - Kiquenet

2

尝试检查是否有其他进程在没有共享读取权限的情况下锁定了相同的文件。同时启用绑定错误日志记录。在Win7开始菜单中键入“fusion”,以管理员身份运行它,以便设置不会变灰。然后设置“将绑定失败记录到磁盘”并指定日志文件的位置。如果您没有收到任何日志,请在注册表中检查HKLM\Software\Microsoft\Fusion\ForceLog = 1。


1
我相信在XP上也可以记录绑定错误。这是.NET的功能,而不是Win7的。 - Piotr Perak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接