我的UnitTest遇到问题。我想测试我的数据访问,这是使用基于NPoco的存储库完成的。因此,我编写了几个测试,测试项目通过NuGet检索NUnit,NPoco,System.Data.SQLite和其他一些Stuff。
这是TestProject的app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="RepositoryTests.Properties.Settings.ConnectionString" connectionString="Data Source=db.sqlite;Version=3" />
</connectionStrings>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
</configuration>
在VS中,项目构建良好。在Visual Studio中触发测试也可以。
使用MSBUILD构建项目也可以。使用msbuild.exe构建测试后,通过nunit运行测试会引发异常:
Unable to find the requested .Net Framework Data Provider. It may not be installed.
只有在直接使用nunit执行测试时才会出现这种情况(例如nunit-console.exe myproject.csproj /config:Release
)。在VS中触发它们没有问题。
有人知道如何解决这个问题吗?
答案 0 :(得分:1)
问题是由nunit测试运行器有自己的app.config导致你的设置不存在。
解决问题的最简单方法是将配置从app.config移到代码本身。无论你在app.config中拥有什么,都可以在代码中完成。
另一种解决方案是将配置移动到单独的文件中,然后使用代码显式加载该文件的配置。只需确保将文件复制到build的输出文件夹中。
您可以使用以下内容:
public static class TestFactory
{
public static DatabaseFactory DbFactory { get; set; }
public static void Setup()
{
var fluentConfig = FluentMappingConfiguration.Configure(new OurMappings());
//or individual mappings
//var fluentConfig = FluentMappingConfiguration.Configure(new UserMapping(), ....);
DbFactory = DatabaseFactory.Config(x =>
{
// Load the connection string here or just use a constant in code...
x.UsingDatabase(() => new Database("connString");
x.WithFluentConfig(fluentConfig);
x.WithMapper(new Mapper());
});
}
}
有关详细信息,请参阅here。
然后在测试夹具中:
[TestFixture]
public class DbTestFixture
{
[TestFixtureSetUp]
public void Init()
{
TestFactory.Setup();
}
[Test]
public void YourTestHere()
{
var database = TestFactory.DbFactory.GetDatabase();
...
}
}
答案 1 :(得分:0)
我通过创建app.config
文件的副本来实现它,并为该副本提供Test-Project的名称,然后是.config
。因此,如果我们假设项目名为 Test.Project ,则副本必须命名为 Test.Project.config 。 Nunit似乎没有加载自动生成的 Test.Project.dll.config 。可以在NUnit-docs(配置文件 - &gt;测试配置文件 - &gt;第3段,最后一句)中找到此信息。
在VS中,在该复制文件的Properties-Section中,我将copy-to-output-directory-property设置为always
。
使用nunit-console.exe
执行测试然后导致另一个异常(Bad-Image
),这是由NUnit找不到 SQLite.Interop.dll - 文件引起的。通过添加已存在于x64
或x86
文件夹中的文件作为VS中解决方案的现有元素并设置copy-to-output-dir,可以解决这种问题。 - 属于always
。