C# 无法加载DLL';Microsoft.Data.SqlClient.SNI.x86.dll';使用Microsoft.Data.SqlClient 2.0时的单元测试

C# 无法加载DLL';Microsoft.Data.SqlClient.SNI.x86.dll';使用Microsoft.Data.SqlClient 2.0时的单元测试,c#,unit-testing,mstest,vstest.console.exe,microsoft-data-sqlclient,C#,Unit Testing,Mstest,Vstest.console.exe,Microsoft Data Sqlclient,在我的代码中使用Microsoft.Data.SqlClient包(版本2.0)时,当通过CI提供程序中的VSTest.console.exe执行单元测试时(以及在本地运行时),我遇到以下错误: System.TypeInitializationException:的类型初始值设定项 “Microsoft.Data.SqlClient.TdsParser”引发了异常。--> System.TypeInitializationException:的类型初始值设定项 “Microsoft.Data.

在我的代码中使用Microsoft.Data.SqlClient包(版本2.0)时,当通过CI提供程序中的VSTest.console.exe执行单元测试时(以及在本地运行时),我遇到以下错误:

System.TypeInitializationException:的类型初始值设定项 “Microsoft.Data.SqlClient.TdsParser”引发了异常。--> System.TypeInitializationException:的类型初始值设定项 “Microsoft.Data.SqlClient.SNILoadHandle”引发了异常。--> System.DllNotFoundException:无法加载DLL “Microsoft.Data.SqlClient.SNI.x86.dll”:无法找到指定的模块 被发现

NCrunch和Visual Studio 2019测试运行程序可以正确执行代码,单元测试也可以正常运行-那么问题出在哪里?

问题在于VSTest.Console.exe扫描单元测试程序集以查找依赖项,并将结果复制到输出目录以进行测试

尽管Microsoft.Data.SqlClient包相关包Microsoft.Data.SqlClient.SNI将Microsoft.Data.SqlClient.SNI.x86.dll和Microsoft.Data.SqlClient.SNI.x64.dll文件正确放置在程序集输出文件夹中,但VSTest.Console.exe不会自动将它们标识为依赖项并将它们复制到测试输出文件夹中,所以测试失败了

我的解决方法是通过一个特殊用途的测试类显式地将DLL指定为测试的部署项,如下所示:

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace MyTests
{
    /// <summary>
    /// Ensures Microsoft.Data.SqlClient dependencies exist for tests.
    /// </summary>
    /// <remarks>
    /// This class performs no tests and is here purely to ensure that the Microsoft.Data.SqlClient.SNI.*
    /// exist for unit testing purposes (specifically when VSTest.Console is used by the build).
    /// This was introduced for Microsoft.Data.SqlClient 2.0.1 and Microsoft.Data.SqlClient.SNI 2.1.0.
    /// Thos packages need to be a package reference on the unit test project.
    /// Later versions may not need this workaround.
    /// </remarks>
    [TestClass]
    [DeploymentItem("Microsoft.Data.SqlClient.SNI.x86.dll")]
    [DeploymentItem("Microsoft.Data.SqlClient.SNI.x64.dll")]
    public class TestSqlClient
    {
        [TestMethod]
        public void TestSqlClient_Test()
        {
        }
    }
}
VSTest.Console /Diag:D:\Temp\trace.log /ResultsDirectory:D:\Temp\TestResults d:\Repos\YourRepo\YourProject.Tests\bin\Debug\YourProject.Tests.dll