Как получить доступ к неудачному значению из любого?
В приведенном ниже примере:
- Тип:
Either<RangedNumberValueFailuresAbstract<int>, int>
- Если нет ошибки:
right(number)
- Если ошибка:
left(RangedNumberValueFailuresAbstract.invalidNumber(failedNumberValue: number))
Если нам нужно получить доступ к failedNumberValue в (failedNumberValue: number), как бы мы это сделали?
@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>;
}
1 ответ
Полный пример с модульными тестами можно найти здесь.
Если углубиться в модульные тесты, они выполняются двумя разными способами:
Либо модульный тест с использованием структуры тестовых случаев, используя результаты слева и справа
Либо модульный тест с использованием инфраструктуры тестовых случаев, используя failedNumberValue для результатов Left
В последнем случае доступ к failedNumberValue осуществляется следующим образом:
final actual = testClass.getValue.fold(
(l) => (l as RangedNumberValueFailuresAbstract).failedNumberValue,
(r) => r,
);