flutter - 如何从任何一个访问失败的值?
问题描述
在下面的示例中,我们有:
- 类型:
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>;
}
解决方案
单元测试的完整示例可以在这里找到。
如果您深入研究单元测试,它们以两种不同的方式执行:
使用测试用例框架使用左右结果进行单元测试
使用测试用例框架对 Left 结果使用 failedNumberValue 进行单元测试
在后者中,failedNumberValue 的访问方式如下:
final actual = testClass.getValue.fold(
(l) => (l as RangedNumberValueFailuresAbstract).failedNumberValue,
(r) => r,
);
推荐阅读
- s4sdk - 无法在 approuter 应用程序中获取 /api/business-partners
- node.js - 创建一个 TypeScript 库并将其从 Node.js 与 ES6 和 TypeScript 一起使用
- javascript - 复选框更改事件仅在重新加载页面后触发
- java - 超过金额限制后不显示消息
- terminal - 每次启动终端时都会出现 kubectl 消息
- react-native - 反应原生地图 MapView.onPress 并不总是被触发
- graph - 如何使用 Intune Graph AP 获取所有托管设备的 roleScopeTagIds?
- html - 如何在VBA中将替换文本的颜色更改为html
- javascript - 从 Contenteditable div 美化 innerHTML
- javascript - 你能/如何将构造函数添加到对象中吗?