Tonight, I start testing the code in Design Patterns in Dart. I expect my testing approach will evolve as the book is written. For now, I plan to test code used directly in the book (for obvious reasons) and some of the experimental code that I use to explore patterns before writing.
To start, I will write some tests for the Flyweight pattern coffee shop example with which I have been playing. I start by adding the test packages to the list of development dependencies in my
pubspec.yaml:name: flyweight_code
dependencies:
reflectable: any
dev_dependencies:
test: any
transformers:
- reflectable:
entry_points:
- bin/coffee_orders.dart
formatted: trueAfter a pub get, I start a test/coffee_shop_test.dart file:library coffee_shop_test;
import 'package:test/test.dart';
import 'package:flyweight_code/coffee_shop.dart';
main(){
// Tests will go here...
}With that, I can define some test setUp() to create my flyweight-based coffee shop and place some coffee orders: var shop;
setUp((){
shop = new CoffeeShop()
..order('Cappuccino', 'large', who: 'Fred', fooFoo: 'Extra Shot')
..order('Espresso', 'small', who: 'Bob')
..order('Cappuccino', 'large', who: 'Alice');
});I can test some of the properties of this coffee shop: test('it can calculate profit', (){
expect(shop.profit, 15.2);
});
test('it flyweights', (){
expect(CoffeeFlavor.totalCount, 2);
});The profit is based on the cost per ounce of the different coffees. The total count of coffee flavors is determined from the number of flyweight objects in use. Those are both fairly easy tests and do not take much effort to get working. Testing in Dart is still quite pleasant.I am curious about testing
print() statements. I have not had an excuse to do so in any of my Dart code to date, but I happen to use print statements in the serve() method of the coffee shop: void serve() {
_orders.forEach((o) { print("Served ${o.service}.");});
}The service property for the orders is something like "Espresso to Bob", so I want to verify that serving drinks prints out the phrase "Served Espresso to Bob". Since there are a number of print() statements throughout the code, I need to verify that all prints contain this phrase. In test parlance, this is expressed as: test('prints when serving', (){
expect(shop.serve, prints(contains('Served Espresso to Bob.')));
});So that turns out to be pretty easy! More importantly, the tests all pass:$ pub run test -r expanded 00:00 +0: test/coffee_shop_test.dart: it can calculate profit 00:00 +1: test/coffee_shop_test.dart: it flyweights 00:00 +2: test/coffee_shop_test.dart: prints when serving 00:00 +3: All tests passed!So I can test an individual patterns. Now I need to test all of them in the repository. As far as I know, this is the purview of Bash scripts. Fortunately, I have done this before:
#!/bin/bash -e
shopt -s extglob
for X in !(LICENSE|README.md|bin|packages)
do
# Change the current working directory to pattern directory
cd $X
echo "[TEST] $X "
# Update pub
echo -n "pub update"
pub get >/dev/null
echo " (done)"
# Run the actual tests
pub run test
echo
# Back to the top-level directory
cd - >/dev/null
doneThis iterates over all files and directories in the repository, except for LICENSE, README.md, bin, and packages. In each code directory, it runs the tests. With that, I have a build script for my book code:$ ./bin/test.sh [TEST] flyweight pub update (done) 00:00 +3: All tests passed!I think that I am done now with the Flyweight pattern. I may make a quick check of things tomorrow, but I am likely on to a new pattern.
Day #14
No comments:
Post a Comment