2016-10-07 27 views
1

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

这个测试程序是一个形式的应用程序,但不使用MVVMCross,我已经没有任何运气将它设置为使用MVVMCross由于应用程序类加载类型的应用程序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(或有替代方法?)和依赖注入来设置此测试的想法?

回答

3

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

  1. 创建NUnit测试应用项目
  2. Install-Package MvvmCross.StarterPack -Version 4.1.4
  3. 摆脱Views文件夹
  4. 的安装SQLite的插件
  5. 参考你的核心项目
  6. Install-Package MvvmCross.Forms.Presenter -Version 4.1.4
  7. 删除MainLauncher = true from MainActivity
  8. Adust 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); 
        } 
    } 
    
  • 撰写测试like
  • [TestFixture] 
    public class TestClass 
    { 
        [Test] 
        public void TestMethod() 
        { 
         var service = Mvx.Resolve<IDataStorageService>(); 
         Assert.IsNull(service.UserData); 
        } 
    } 
    
  • 享受MvvmCross
  • 迷死
    +0

    完美,非常感谢! –