1

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

  • 类型:Either<RangedNumberValueFailuresAbstract<int>, int>
  • 如果没有错误:right(number)
  • 如果错误:left(RangedNumberValueFailuresAbstract.invalidNumber(failedNumberValue: number))

如果我们需要访问 (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>;
    }
4

1 回答 1

1

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

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

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

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

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

    final actual = testClass.getValue.fold(
      (l) => (l as RangedNumberValueFailuresAbstract).failedNumberValue,
      (r) => r,
    );
于 2020-08-10T11:52:00.160 回答