使用NUnit执行测试时找不到System.Data.SqLite DataProvider

时间:2015-01-15 13:01:40

标签: c# visual-studio msbuild nunit system.data.sqlite

我的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中触发它们没有问题。

有人知道如何解决这个问题吗?

2 个答案:

答案 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 - 文件引起的。通过添加已存在于x64x86文件夹中的文件作为VS中解决方案的现有元素并设置copy-to-output-dir,可以解决这种问题。 - 属于always