首页 > 解决方案 > 如何从任何一个访问失败的值?

问题描述

在下面的示例中,我们有:

如果我们需要访问 (failedNumberValue: number) 中的 failedNumberValue,我们该怎么做呢?

示例

    @immutable
    class RangedNumberValueObjectLibrary extends ValueObjectAbstract {
      factory RangedNumberValueObjectLibrary({@required int number}) {
        var validatedNumber = RangedNumberValueValidationLibrary.validate(number: number);

        return RangedNumberValueObjectLibrary._(value: validatedNumber);
      }

      @protected
      RangedNumberValueObjectLibrary._({@required value}) : super.private(value: value);
    }
    @immutable
    class RangedNumberValueValidationLibrary extends ValueValidationAbstract {
      @protected
      static const _minimum = 2;
      @protected
      static const _maximum = 4;

      static Either<RangedNumberValueFailuresAbstract<int>, int> validate({@required int number}) => _minimum <= number && number <= _maximum ? right(number) : left(RangedNumberValueFailuresAbstract.invalidNumber(failedNumberValue: number));
    }

上面使用了以下使用 Freezed 包的抽象类。

    @freezed
    @immutable
    abstract class RangedNumberValueFailuresAbstract<T> extends ValueFailuresAbstract with _$RangedNumberValueFailuresAbstract<T> {
      const factory RangedNumberValueFailuresAbstract.invalidNumber({@required T failedNumberValue}) = InvalidNumber<T>;
    }

标签: flutterdartfunctional-programmingdartz

解决方案


单元测试的完整示例可以在这里找到。

如果您深入研究单元测试,它们以两种不同的方式执行:

使用测试用例框架使用左右结果进行单元测试

使用测试用例框架对 Left 结果使用 failedNumberValue 进行单元测试

在后者中,failedNumberValue 的访问方式如下:

    final actual = testClass.getValue.fold(
      (l) => (l as RangedNumberValueFailuresAbstract).failedNumberValue,
      (r) => r,
    );

推荐阅读