gpt4 book ai didi

sqlite - 使用 MVVMCross SQLite 插件构建的单元测试代码

转载 作者:行者123 更新时间:2023-12-03 14:54:33 24 4
gpt4 key购买 nike

我目前正在使用 MVVMCross 构建一个 Xamarin.Forms 项目。为了测试我的平台特定代码,我正在使用 Nunit.Xamarin它具有在设备上运行测试的应用程序。

这个测试应用程序是一个表单应用程序,但不使用 MVVMCross,我没有任何运气将其设置为使用 MVVMCross,因为 Application 类加载了 NUnit.Runner.App 类型的应用程序,而 MVVMCross 需要 MvxFormsApp。

我想测试这个类从 SQLite 数据库保存和加载用户数据:

public class DataStorageService : IDataStorageService
{
private readonly SQLiteConnection _connection;

public User UserData
{
get { return _connection.Table<User>().FirstOrDefault(); }
set { _connection.InsertOrReplace(value); }
}

public DataStorageService(IMvxSqliteConnectionFactory factory)
{
_connection = factory.GetConnection(DataStorageConstants.LocalDatabaseName);
_connection.CreateTable<User>();
}
}

我想实际测试它是否从本地 SQLite 数据库保存和加载,所以我不想模拟 IMvxSqliteConnectionFactory。我尝试将 MVVMCross 和 SQLite 插件安装到项目中,然后传入连接工厂的 Android 实现,但这反复引发了 typeloadexception。

关于如何使用 MVVMCross (或者有其他选择吗?)和依赖注入(inject)来设置这个测试的任何想法?

最佳答案

有可能 :) 重要的事情发生在 MvxSplashScreenActivity . MvxFormsApp基本上是空的。所以我们不必在意。示例代码:https://github.com/smstuebe/stackoverflow-answers/tree/master/mvx-android-test-app

  • 创建一个 nunit 测试应用项目
  • Install-Package MvvmCross.StarterPack -Version 4.1.4
  • 摆脱Views文件夹
  • 安装 SQLite 插件
  • 引用您的核心项目
  • Install-Package MvvmCross.Forms.Presenter -Version 4.1.4
  • 删除 MainLauncher = true来自 MainActivity
  • Setup返回您的核心项目的App

  • protected override IMvxApplication CreateApp()
    {
    return new MyApp.Core.App();
    }
  • 将启动画面更改为 ( source )

  • [Activity(MainLauncher = true
    , Theme = "@style/Theme.Splash"
    , NoHistory = true
    , ScreenOrientation = ScreenOrientation.Portrait)]
    public class SplashScreen
    : MvxSplashScreenActivity
    {
    public SplashScreen()
    : base(Resource.Layout.SplashScreen)
    {
    }

    private bool _isInitializationComplete;
    public override void InitializationComplete()
    {
    if (!_isInitializationComplete)
    {
    _isInitializationComplete = true;
    StartActivity(typeof(MainActivity));
    }
    }

    protected override void OnCreate(Android.OS.Bundle bundle)
    {
    Forms.Init(this, bundle);
    Forms.ViewInitialized += (object sender, ViewInitializedEventArgs e) =>
    {
    if (!string.IsNullOrWhiteSpace(e.View.StyleId))
    {
    e.NativeView.ContentDescription = e.View.StyleId;
    }
    };

    base.OnCreate(bundle);
    }
    }
  • 写一个像
  • 这样的测试

    [TestFixture]
    public class TestClass
    {
    [Test]
    public void TestMethod()
    {
    var service = Mvx.Resolve<IDataStorageService>();
    Assert.IsNull(service.UserData);
    }
    }
  • 享受 MvvmCross 的精彩
  • 关于sqlite - 使用 MVVMCross SQLite 插件构建的单元测试代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39922565/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com