MVVMCross SQLite插件集成测试

时间:2014-02-03 20:25:15

标签: sqlite mvvmcross

我已按照MVVMCross N + 1教程的步骤29中提供的说明,成功为我的基于MVVMcross的应用程序创建了一个单元测试项目,该教程模拟了实际用于从数据库加载数据的服务。

现在我需要使用实际数据库的副本来实现视图模型的一些集成测试。

我在测试课中所做的工作如下:

[TestFixture]
public class BaseDataServiceTests
: MvxIoCSupportingTest {

  [TestFixtureSetUp]
  public void ConfigureServices() {
    base.ClearAll();
    var sqLiteConnectionFactory = new MvxWpfSqLiteConnectionFactory();

    Ioc.RegisterSingleton<ISQLiteConnectionFactory>( sqLiteConnectionFactory );
  }

  [Test]
  public void OpenDataBase() {
    //=== Arrange
    var baseDataService = new BaseDataService( Ioc.Resolve<ISQLiteConnectionFactory>() );

    //=== Act
    var sqLiteConnection = baseDataService.SqLiteConnection;

    //=== Assert
    Assert.IsInstanceOf<ISQLiteConnection>(sqLiteConnection);
  }

  [Test]
  [SetUICulture( "en-US" )]
    public void GetEnglishExcelentTranslation() {
    //=== Arrange
    const int excelentID = 10;
    var baseDataService = new BaseDataService( Ioc.Resolve<ISQLiteConnectionFactory>() );

    //=== Act
    var excelentString = baseDataService.GetLocalizedString( excelentID );

    //=== Assert
    Assert.AreEqual( "Excelent", excelentString );
  }
}

如果我只是运行这些测试,它们会在baseDataService构造函数上失败,我在其中使用SqLiteConnectionFactory的Create方法打开数据库文件,但有一个例外,说明无法加载sqlite3 dll。

如果我手动将sqlite3.dll放在测试项目的bin目录中(如本网站建议的另一篇文章),则GetLocalizedString方法的测试失败,表明即使表中找不到引用的表创建并填充数据。

我觉得我在SqLitePlugin初创公司中遗漏了一些东西,但无法弄清楚如何在测试项目中正确地初始化它。

测试项目是一个标准的Windows库,通过NuGet和MVVMCross SQLite社区插件引用MVVMCross库。

非常感谢任何帮助。

提前致谢,

安东内

1 个答案:

答案 0 :(得分:1)

sqlite3.dll的路径问题只是表明您需要从c#项目中引用该二进制文件。一种方法是使用构建操作“无”包含dll - 但是在dll上指定“始终复制到输出”。但请注意,根据目标计算机,您可能需要单独的32位和64位dll。

关于这些类型的问题的更多信息,那么可能值得提出更为一般性的“管理到原生”的问题 - 有很多人可以帮助这些问题,但是他们可能会被“推迟”/过多地混淆谈论mvvm和sqlite:)


一旦解决了这个路径问题,我就没有看到为什么sqlite插件不能正常工作的原因。我建议你尝试一下往返单元测试:

  • 创建数据库
  • 创建表格
  • 添加一行
  • 获取行

类似的东西(原谅手机打字 - 没有智能感知的记忆编码):

[TestMethod]
public void MyTest()
{
     // your setup stuff
     var c = factory.Create("Test.db");
     c.CreateTable<Foo>();
     c.Insert(new Foo(){ Bar = 1234 });
     var result = c.Table<Foo>().ToList();
     Assert.AreEqual(1234, result[0].Bar);
 }

如果有效,那么sqlite正在运行(至少是冒烟测试版)。