如何在 Flutter 中为用户输入验证和 maxLength 创建一个简单的单元测试,并且具有空安全性

Posted

技术标签:

【中文标题】如何在 Flutter 中为用户输入验证和 maxLength 创建一个简单的单元测试,并且具有空安全性【英文标题】:How to create a simple unit test in flutter for user input validation and maxLength with null safety 【发布时间】:2021-12-03 21:22:23 【问题描述】:

我正在尝试对我创建的表单进行简单的单元测试。我参考了一些文件和 YouTube 视频来做到这一点。但是形式上单元测试的资源不多,可用的一次与当前版本不兼容(空安全)。

谁能解释我如何对我的验证部分和表单字段中的 maxLength 进行单元测试。

这是我尝试过的代码,但显示错误且无法继续。

class FullNameValidator
  static String? validate(String value)
    return value.isEmpty ? 'Please enter full name' : null;
  


              TextFormField(
                  decoration: InputDecoration(
                    labelText: "FullName",
                    labelStyle: TextStyle(color: Colors.black),
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(10),
                    ),
                  ),
                  maxLength: 30,
                  keyboardType: TextInputType.text,
                  controller: fullName,
                  validator: FullNameValidator.validate, //Showing error in here
                ),

我尝试过的测试

void main()
  test('empty email returns error string', ()
    var result = FullNameValidator.validate("");
    expect(result, 'Please enter your full name');
  );

谁能解释一下如何对验证和 maxLength 进行单元测试。 我搜索了所有可以搜索的文档/视频,但找不到解决方案。请帮忙

【问题讨论】:

【参考方案1】:

它会向您显示此错误,因为 TextFieldvalidator 属性期望 String? Function(String?) 作为其参数,而您的 FullNameValidator.validateString? Function(String),您可以通过以下方式解决此问题:

class FullNameValidator
  // Make your value nullable
  static String? validate(String? value) 

    // Now that value can be null you cannot be sure that isEmpty can be called
    // so you need to provide a default value, in this case I am returning
    // true if isEmpty cannot be called so it will return 'Please enter full name'.
    return (value?.isEmpty ?? true) ? 'Please enter full name' : null;
  

您不需要测试maxLength,因为通过精确maxLength TextField 中的字符串将不能比您定义的数字长。

如果你真的想验证字符串的长度,你可以像这样改变你的方法:

class FullNameValidator
  static String? validate(String? value, [int? maxLength]) 
    if (value != null && maxLength != null) 
      return value.length > maxLength ? 'This is too long' : null;
    
    return (value?.isEmpty ?? true) ? 'Please enter full name' : null;
  

但是你需要像这样在TextField 中调用你的验证器:

TextFormField(
  decoration: InputDecoration(
    labelText: "FullName",
    labelStyle: TextStyle(color: Colors.black),
    border: OutlineInputBorder(
      borderRadius: BorderRadius.circular(10),
    ),
  ),
  // maxLength: 30, // You don't need this property anymore if you rely on your validator
  keyboardType: TextInputType.text,
  controller: fullName,
  validator: (value) => FullNameValidator.validate(value, 30),
),

【讨论】:

以上是关于如何在 Flutter 中为用户输入验证和 maxLength 创建一个简单的单元测试,并且具有空安全性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中为 Snack Bar 编写一个简单的测试?

如何使用 Flutter 在 Firebase 中正确登录和注册?

如何将用户的TextFormField输入传递给flutter中不同类的按钮

如何在Django中为SQLServer数据库创建身份验证系统?

如何在 SwiftUI 中为 Start->Max->Start 设置动画?

如何在spring security中为来自两个不同表的不同用户配置身份验证?