测试MobileServiceSQLiteStore

时间:2016-07-31 17:30:49

标签: android sqlite azure azure-mobile-services xamarin-studio

单元测试访问MobileServiceSQLiteStore

时无法加载文件或程序集SQLitePCL

我一直在尝试按照Azure入门说明为移动应用程序构建我的第一个Microsoft Azure WebAPI https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-dotnet-how-to-use-client-library/

移动应用程序使用MobileServiceSQLiteStore类的脱机同步(推送,拉取)。我遇到的问题是我不断收到could not load...SQLitePCL错误。我现在花了整整2天的时间,已经阅读了很多类似的堆栈溢出问题,非常相似,但没有一个能帮助解决这个问题。

目标,除了简单地通过这个错误(如果有更实际的工作)是能够编写集成(验收测试)和单元测试,测试我将编写的代码以包装MobileServiceSqlLiteStore类。

无论我做什么,我都无法让db.DefineTable<xxDTO>();在Windows控制台或在Windows下运行的单元测试中工作。 当我运行以下代码时;

public class Person
{
    public int ID { get; set; }

    [JsonProperty(PropertyName = "text")]
    public string FirstName { get; set; }

    [JsonProperty(PropertyName = "text")]
    public string LastName { get; set; }
}

[Test]
public void can_create_db_and_create_table()
{
    var filename = @"d:\test\testdb.db3";
    SQLitePCL.Batteries.Init();                // this excecutes -> raw.SetProvider((ISQLite3Provider) new SQLite3Provider_esqlite3());
    var db = new MobileServiceSQLiteStore(filename);
    db.DefineTable<Person>();
}

我总是收到以下错误 - &gt;的 Could not load file or assembly SQLitePCL version 3.8.7.2

重现问题的步骤

  1. 安装SQLITE(3)运行时和工具; sqlite-winrt-3130000.vsix(从https://www.sqlite.org/download.html下载)
  2. 创建新的类项目.Net 4.5.1
  3. 添加以下包
    • install-package SQLitePCL.bundle_green -version 0.9.3
    • Install-package System.Data.SQLite -version 1.0.102.0
    • Install-package nunit -version 3.4.1
  4. 运行上面显示的单元测试。
  5. System.Data.SQLite足够简单,但与安装在Android上的Sqlite版本不兼容。即以下代码在Windows上轻松运行;

    [Test]
    public void prove_we_can_perform_normal_system_data_sqllite_commands()
    
    {
     var path = @"d:\test\provedb2.db";
     File.Create(path).Dispose();
     using (var conn = new System.Data.SQLite.SQLiteConnection($"Data Source={path};Version=3;"))
            {
               conn.Open();
                var cmd = new SQLiteCommand("create table customer (name, tel, add1, add2, id UNIQUE)",conn);
                cmd.ExecuteNonQuery();
            }
    }
    

    ...但这与Adroid和MobileServiceSQLiteStore类提供的功能不兼容。

    如果我使用dot net Reflector反编译MobileServiceSQLiteStore类,我可以确认MobileServiceSQLiteStore似乎是SQLitePCL类的包装。 如果我运行以下单元测试,我会遇到与尝试访问MobileServiceSQLiteStore类时相同的错误,这就是为什么我希望在不在Android内部/上运行时可以访问此类?

    [Test]
    public void show_MobileServiceSQLiteStore_gives_same_error_as_SQLLitePCL_which_it_wraps()
    {
    
        var path = @"provedb2.db";
        using (var db = new  SQLitePCL.SQLiteConnection($"Data Source={path};Version=3;"))
        {
            var cmd = db.Prepare("create table customer (name, tel, add1, add2, id UNIQUE)");
            cmd.Step();
        }
        // this fails with Unable to load DLL 'sqlite3.dll' >>> aargh!            
    }
    

    拥有这样一个神奇的神级并且无法对其进行单元测试或在其周围创建一个安全的包装似乎很荒谬?

    P.S。我的开发机器是一个干净的Windows 7专业版,有一个干净,清新,最新的Visual Studio 2015,专门为这个项目提供。

    关于如何在Windows上运行此课程的任何建议或建议将超级赞赏!即如何通过'无法加载文件或程序集SQLitePCL'错误。

    提前感谢所有人。

    最好的问候,

    艾伦

1 个答案:

答案 0 :(得分:3)

Azure Mobile Apps SDK和工具仅受Windows 8或更高版本的开发环境支持。您可能能够在Windows 7上使用它的某些部分,但不幸的是我们不支持或测试该配置。

您已经安装了SQLitePCL.bundle_green软件包,但是客户端SDK使用的软件包,我们使用SQLitePCL。这就是为什么软件包安装似乎有效,但客户端库实际上并不起作用。

您可以在.NET 4.5控制台应用程序中运行某些客户端库单元测试,请参阅https://github.com/Azure/azure-mobile-apps-net-client#running-the-tests