【问题标题】:How do you test if an exception is thrown in Flutter?如何测试 Flutter 中是否抛出异常?
【发布时间】:2021-02-26 18:31:09
【问题描述】:

我似乎无法测试 Flutter 中是否抛出异常。考虑到我期望出现异常,如果抛出异常,我希望测试能够通过。

我尝试过的:

import 'package:flutter_test/flutter_test.dart';

void main() {
  test('Range error test', () {
    expect(throw RangeError(""), throwsA(RangeError("")));
  });
  test('Range error test', () {
    expect(throw RangeError(""), throwsA(RangeError));
  });

  test('Range error test', () {
    expect(throw RangeError(""), throwsRangeError);
  });

  test('ConcurrentModificationError error test', () {
    expect(throw ConcurrentModificationError(""), throwsA(ConcurrentModificationError));
  });

  test('NumberFormat error test', () {
    expect(int.parse("sdffg"), throwsA(FormatException));
  });

  test('NumberFormat error test', () {
    expect(int.parse("sdffg"), throwsFormatException);
  });

  test('Range error test', () {
    var list = [];
    expect(list[1], throwsRangeError);
  });

  test('Range error test', () {
    var list = [];
    expect(list[1], throwsA(RangeError));
  });
}

pubspec.yaml 中的依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

dev_dependencies:
  flutter_test:
    sdk: flutter
  test:

在 Android Studio 中运行它们后的错误(从 cli 运行时出现相同的错误):

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以使用try-catch

    try{
    // check condition
    
    }catch(e){
      print(e)
    }
    

    如果发生任何错误,catch 将捕获它并打印出错误。

    【讨论】:

      【解决方案2】:

      让我们举一个例子:

      expect(throw RangeError(""), throwsA(RangeError("")));
      

      这里有一些问题。

      由于throw RangeError("") 是更大表达式的一部分,它会在整个表达式之前进行评估,因此如果throw RangeError("") 中断流程,您不能指望expect() 被评估。

      为了使这个解释更具教学性,假设我们将参数提取到变量中:

      final neverAssigned = throw RangeError("");
      final throwsRangeError = throwsA(RangeError(""));
      expect(neverAssigned, throwsRangeError);
      

      您可能已经意识到,我们永远不会到达expect(),因为程序已经在第一行抛出。

      为了解决这个问题,expect() 要求你传递一个可能抛出的函数。它将检查它是否是一个函数,将调用包装在 try-catch 中并检查抛出的错误是否是您所期望的。

      我们最终应该是这样的:

      expect(() => throw RangeError(""), throwsA(RangeError("")));
      

      但是,这也不起作用,因为错误通常不会实现operator ==hashCode,所以RangeError("") == RangeError("") 给你false。这意味着要检查抛出的错误是否正是您所期望的并不是那么简单。

      相反,您应该只检查带有throwsA(isA<RangeError>())check the message with having 之类的类型。

      【讨论】:

        猜你喜欢
        • 2021-08-25
        • 2019-06-11
        • 1970-01-01
        • 2023-01-25
        • 2019-11-26
        • 2021-06-20
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多