走进 UnitTest for Xamarin.Forms

之前讲了 Xamarin.Forms 的 UITest

但 UnitTest 更是不可缺少的,不管写什么开发都是需要的

以下演示基于

  • WIN 10 17017 Preview
  • VS 2017 15.4
  • Visual Studio Emulator for Android ( 5.5" Marshmallow(6.0.0) XXHDPI Phone API Level 23(Marshmallow, 6.0.0) )

一、创建 Test 项目

在项目上添加一个 Unit Test 项目,并引用 PCL 项目,因为逻辑代码都在这里

默认是 MSTest ,当然你也可以用 NUnit Test 或者 XUnit Test,我这里就用默认的了

其次,因为项目用了 Prism 框架,所以这里也要引用 Prism,还有 Moq,最后就是下边这个样式,其他的都是连带的引用的

二、添加测试代码

这里很简单了,就和写其他的 Test 代码是一样的,当然要测试成功登录和失败登录了,测试就是要考虑各种情况,极限,边界,对与错等

需要的参数肯定是没有的,Moq 就是来搞个假的参数的,最终结果就是看 LoginCommand 是否执行过,错误肯定是不执行的,或者错误时检查返回的错误信息等,这里就建单点,直接看 LoginCommand 是否执行吧

        [TestMethod]
        public void TestSuccessLogin()
        {
            var navigationService = new Mock<INavigationService>();
            var eventAggregator = new Mock<IEventAggregator>();
            var pageDialogService = new Mock<IPageDialogService>();
            var loginPageViewModel = new LoginPageViewModel(navigationService.Object, eventAggregator.Object, pageDialogService.Object)
            {
                Username = "Name",
                Password = "Password"
            };

            var loginCommand = loginPageViewModel.LoginCommand;

            Assert.IsNotNull(loginCommand);
            Assert.IsTrue(loginCommand.CanExecute("DataCabinPage"));

            loginCommand.Execute("DataCabinPage");
            navigationService.Verify(m => m.NavigateAsync("DataCabinPage", null, null, true), Times.Once);
        }

        [TestMethod]
        public void TestFaildLogin()
        {
            var navigationService = new Mock<INavigationService>();
            var eventAggregator = new Mock<IEventAggregator>();
            var pageDialogService = new Mock<IPageDialogService>();
            var loginPageViewModel = new LoginPageViewModel(navigationService.Object, eventAggregator.Object, pageDialogService.Object);

            pageDialogService
                .Setup(m => m.DisplayAlertAsync("Error", "Wrong Username or Password", "OK!"))
                .Returns(Task.FromResult(true));

            var loginCommand = loginPageViewModel.LoginCommand;

            Assert.IsNotNull(loginCommand);
            Assert.IsTrue(loginCommand.CanExecute("DataCabinPage"));

            loginCommand.Execute("DataCabinPage");
            navigationService.Verify(m => m.NavigateAsync("DataCabinPage", null, null, true), Times.Never);
        }

三、结果

其实测试是有必要的,但是很多小公司都不写,一是没时间写,需求太多,人手不够。二是变化太快,写了反倒是麻烦,但从正规的开发流程和质量角度来看,都是必要的,也是团队考核的一个考察点

时间: 2024-10-20 13:45:43

走进 UnitTest for Xamarin.Forms的相关文章

走进 Prism for Xamarin.Forms

一.使用环境 OS:Win 10 16273 VS:VS2017- 15.3.4 Xamarin:4.6.3.4,nuget:2.4 Android Emulator:Visual Studio for Android Emulator(相比 Android Emulator不用下载SDK,而且启动快) 二.安装 Prism 模块 工具--扩展和更新--搜索 Prism Template Pack--安装 三.开始搞起 1.先建个项目 2.添加页面 Views文件夹右键--添加--新建项,弹出来

菜鸟的Xamarin.Forms前行之路——原生Toast的简单实现方法

项目中信息提示框,貌似只有个DisplayAlert,信息提示太过于单一,且在有些场合Toast更加实用,以下是一个简单的原生Toast的实现方法 项目地址:https://github.com/weiweu/TestProject/tree/dev/Toast 共享项目 定义一个接口IToast,包括Short和Long两个方法: public interface IToast { void LongAlert(string message); void ShortAlert(string m

张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )

所谓 UWP 样式的汉堡菜单,我曾在"张高兴的 UWP 开发笔记:汉堡菜单进阶"里说过,也就是使用 Segoe MDL2 Assets 字体作为左侧 Icon,并且左侧使用填充颜色的矩形用来表示 ListView 的选中.如下图 但怎样通过 Xamarin.Forms ,将这一样式的汉堡菜单带入到 Android 与 iOS 中呢? 一.大纲-细节模式简介 讲代码前首先来说说这种导航模式,官方称"大纲-细节模式"(MasterDetail).左侧的汉堡菜单称为&qu

菜鸟的Xamarin.Forms前行之路——绪言

作者入门时间不是很久,差不多一年,期间自学的东西比较杂乱,到目前为止,编程方面的知识比较薄弱.之所以做这个系列,也只是因为做了两个月的Xamarin.Forms方面的东西,由于资料和自身实力的原因,过程走的比较艰难,但所幸的是也解决了部分的问题,积累了一些经验.期望通过这个系列,和大家分享经验,查漏纠错. 作为一个菜鸟,在解决问题的时候,往往比较直接,就是仅仅为了解决问题,期间可能根本没有考虑性能等方面的问题.所以在这个系列中,问题肯定是作者亲身实践能够解决的,但是在性能资源等方面作者没有做过考

Xamarin.Forms开发APP

Xamarin.Forms+Prism(1)-- 开发准备 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xamarin.Forms 最新版: 4.Prism 扩展,打开VS的扩展和更新,在联机中,搜索Prism,安装第一个扩展Prism Template Pack: 5.Android SDK,这个下载已经非常快了,国内已经支持Android环境下载. 6.都准备好后,请确保创建一个新的Xamarin.Forms程序后,能正常调试运行,不能调试运行的,请百度或

Xamarin.Forms之MessagingCenter

MessagingCenter是Xamarin.Forms中很有用但是很难用的东西,使用起来很方便,但是要注意的地方很多 1.Sender能为空 MessagingCenter.Send<CacheUserInfo>(UserInfo.Instance.CurrentLoginUser, "UpdateMenuIconList"); CurrentLoginUser为空的时候,会直接造成界面卡死(不执行下面的代码,但是也不报错,坑爹的地方)

Xamarin.Forms之Effects的使用

在 Xamarin.Forms 2.1.0-pre1 ,Xamarin.Forms新增了新的Effects API. Effects是一系列方法,为了给View的渲染器添加运行时改变. 然而,我想强调的是, Effects天生被设计为高可复用的. 如果一个Effect能够解决一个难题, 它可能能够在你的整个APP中使用.如果你写了一个Effect来解决你的一个难题, 你能够分享它给其他遇到同样问题的人. 这篇文章尝试展示一种方式,能够帮助我们使分享Effects这件事变得很简单. public

菜鸟的Xamarin.Forms前行之路——按钮的按下抬起事件的监控(可扩展至其他事件)

提问:监控按钮的点击事件,可以通过按钮的Click事件,或者Command绑定,那么如何监控按钮的按下与抬起,或者移动,长按,双击等事件? 解决方法:各个平台自定义渲染依赖注入. 共享项目PCL: 1先定义一个继承Button的实体类NewButton.cs public class NewButton : Button { public event EventHandler Pressed; public event EventHandler Released; public virtual

Xamarin.Forms学习之Platform-specific API和文件操作

这篇文章的分享原由是由于上篇关于Properties的保存不了,调用SavePropertiesAsync()方法也不行,所以我希望通过操作文件的方式保存我的需要的数据,然后我看了一下电子书中的第二十章和需要相关知识的第九章,这篇文章中的内容则是我学习这两章的一点记录和分享,还是那样,有错请留言指正,谢谢! 不同的平台存在着一些特定的API,通过在电子书中两章的学习,实践一下如何调用这些API和将这些API封装成公共的库,供以后的项目调用.以一个显示平台信息的小实例开始做一个简单的演示,其运行效