使用 Microsoft.Data.SqlClient 2.0 时无法从单元测试加载 DLL 'Microsoft.Data.SqlClient.SNI.x86.dll'
Unable to load DLL 'Microsoft.Data.SqlClient.SNI.x86.dll' from Unit Tests when using Microsoft.Data.SqlClient 2.0
在我的代码中使用 Microsoft.Data.SqlClient 包(2.0 版)时,通过 [=22 执行单元测试时出现以下错误=] 在我们的 CI 提供商中(当 运行 在本地时):
System.TypeInitializationException: The type initializer for
'Microsoft.Data.SqlClient.TdsParser' threw an exception. --->
System.TypeInitializationException: The type initializer for
'Microsoft.Data.SqlClient.SNILoadHandle' threw an exception. --->
System.DllNotFoundException: Unable to load DLL
'Microsoft.Data.SqlClient.SNI.x86.dll': The specified module could not
be found
代码执行正确,单元测试在 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 没有自动将它们识别为依赖项并将它们复制到测试输出文件夹,因此测试失败。
我的解决方法是通过 special-purpose 测试 class 明确指定 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()
{
}
}
}
这将确保 DLL 存在以供测试。不理想,但它有效!
如果它有用,这就是我 运行 VSTest.Console.exe 诊断此问题的方式:
VSTest.Console /Diag:D:\Temp\trace.log /ResultsDirectory:D:\Temp\TestResults d:\Repos\YourRepo\YourProject.Tests\bin\Debug\YourProject.Tests.dll
在我的代码中使用 Microsoft.Data.SqlClient 包(2.0 版)时,通过 [=22 执行单元测试时出现以下错误=] 在我们的 CI 提供商中(当 运行 在本地时):
System.TypeInitializationException: The type initializer for 'Microsoft.Data.SqlClient.TdsParser' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Microsoft.Data.SqlClient.SNILoadHandle' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'Microsoft.Data.SqlClient.SNI.x86.dll': The specified module could not be found
代码执行正确,单元测试在 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 没有自动将它们识别为依赖项并将它们复制到测试输出文件夹,因此测试失败。
我的解决方法是通过 special-purpose 测试 class 明确指定 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()
{
}
}
}
这将确保 DLL 存在以供测试。不理想,但它有效!
如果它有用,这就是我 运行 VSTest.Console.exe 诊断此问题的方式:
VSTest.Console /Diag:D:\Temp\trace.log /ResultsDirectory:D:\Temp\TestResults d:\Repos\YourRepo\YourProject.Tests\bin\Debug\YourProject.Tests.dll