Skip to content

Instantly share code, notes, and snippets.

@ulisseshen
Created May 30, 2023 22:39
Show Gist options
  • Save ulisseshen/be3e700de3a92f110376914820c9d519 to your computer and use it in GitHub Desktop.
Save ulisseshen/be3e700de3a92f110376914820c9d519 to your computer and use it in GitHub Desktop.
Test doubles em Dart: dummies, fakes, stubs e spies.
enum PizzaAPIError { offline, unauthorized }
class Pizza {
final String name;
Pizza(this.name);
}
class Result<T, E> {
final T? success;
final E? failure;
Result.success(this.success) : failure = null;
Result.failure(this.failure) : success = null;
}
abstract class PizzaGetter {
void getPizza(void Function(Result<List<Pizza>, PizzaAPIError>) completion);
}
class PizzaGetterStub implements PizzaGetter {
final Result<List<Pizza>, PizzaAPIError> result;
PizzaGetterStub.success(List<Pizza> pizzas) : result = Result.success(pizzas);
PizzaGetterStub.failure(PizzaAPIError error) : result = Result.failure(error);
@override
void getPizza(void Function(Result<List<Pizza>, PizzaAPIError>) completion) {
completion(result);
}
}
class PizzaGetterFake implements PizzaGetter {
@override
void getPizza(void Function(Result<List<Pizza>, PizzaAPIError>) completion) {
final pizzas = [
Pizza('Margherita'),
Pizza('Pepperoni'),
Pizza('Mushroom'),
];
completion(Result.success(pizzas));
}
}
class PizzaGetterDummy implements PizzaGetter {
@override
void getPizza(void Function(Result<List<Pizza>, PizzaAPIError>) completion) {
// Não faz nada, é um dummy
}
}
void main() {
final stubSuccess = PizzaGetterStub.success([
Pizza('Margherita'),
Pizza('Pepperoni'),
]);
stubSuccess.getPizza((result) {
if (result.success != null) {
print('Pizzas obtidas com sucesso:');
result.success?.forEach((pizza) {
print(pizza.name);
});
} else if (result.failure != null) {
print('Erro ao obter pizzas: ${result.failure}');
}
});
final stubFailure = PizzaGetterStub.failure(PizzaAPIError.offline);
stubFailure.getPizza((result) {
if (result.success != null) {
print('Pizzas obtidas com sucesso:');
result.success?.forEach((pizza) {
print(pizza.name);
});
} else if (result.failure != null) {
print('Erro ao obter pizzas: ${result.failure}');
}
});
final fake = PizzaGetterFake();
fake.getPizza((result) {
if (result.success != null) {
print('Pizzas obtidas com sucesso:');
result.success?.forEach((pizza) {
print(pizza.name);
});
} else if (result.failure != null) {
print('Erro ao obter pizzas: ${result.failure}');
}
});
final dummy = PizzaGetterDummy();
dummy.getPizza((result) {
if (result.success != null) {
print('Pizzas obtidas com sucesso:');
result.success?.forEach((pizza) {
print(pizza.name);
});
} else if (result.failure != null) {
print('Erro ao obter pizzas: ${result.failure}');
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment