Let's use Test Driven Development (TDD) to help us design a function that meets the following conditions:
'Launch!'
'Code!'
'Rocks!'
'LaunchCode!'
'Code Rocks!'
'Launch Rocks!'
'LaunchCode
Rocks!'
'Rutabagas! That doesn't work.'
Rather than complete the code and then test it, TDD flips the process:
Open this repl.it and note the expected files:
index.js
holds the Jasmine script. DO NOT CHANGE THIS FILE.launchCodeRocks.js
holds the function we want to design, which we will
call launchOutput
.launchCodeRocks.spec.js
holds the testing script.Besides index.js
the files are mostly empty. Only a framework has been
provided for you.
In launchCodeRocks.spec.js
, complete the describe
function by adding a
test for condition #1:
When passed a number that is ONLY divisible by 2,launchOutput
returns'Launch!'
Run the test. It should fail because there is no code inside launchOutput
yet!
In launchCodeRocks.js
, use an if
statement inside the launchOutput
function to check if the parameter is evenly divisible by 2, and then return an
output. (Hint: modulus).
Run the test script again to see if your code passes. If not, modify
launchOutput
until it does.
In launchCodeRocks.spec.js
, add tests for the conditions:
launchOutput
returns
'Code!'
launchOutput
returns
'Rocks!'
Run the tests (you have three now). The two new ones should fail, but the first
should still pass. Modify the it
statements as needed if you see a
different result.
Add more code inside launchOutput
to check if the parameter is evenly
divisible by 2, 3, or 5, and then return an output based on the result.
Run the test script again to see if your code passes all three tests. If not,
modify launchOutput
until it does.
In launchCodeRocks.spec.js
, add a test for the condition:
launchOutput
returns
'LaunchCode!'
(not 'Launch!Code!'
).Run the tests. Only the new one should fail.
Modify launchOutput
until the function passes all four of the tests.
Continue adding ONE test at a time for the remaining conditions. After you add EACH new test, run the script to make sure it FAILS, while the previous tests still pass.
Modify launchOutput
until the function passes the new test and all of the
old ones.
Presto! By starting with the testing script, you constructed launchOutput
one segment at a time. The result is complete, valid code that has already
been checked for accuracy.
Now that your function passes all 8 tests, let's change one of the conditions.
For the case where a number is divisible by both 2 and 5, instead of returning
'Launch Rocks!'
, we want the function to return 'Launch Rocks!
(CRASH!!!!)'
.
Modify the testing and function code to deal with this new condition.
Examine launchOutput
and the describe
functions. Notice that there is
quite a bit of repetition in the code.
Try adding arrays, objects and/or loops to refactor the code into a more efficient structure.
A teammate tried to help you out by writing the launchOutput
code before
class. Unfortunately, the code contains some errors.
Open the
flawed code here, and cut
and paste your testing script into the launchCodeRocks.spec.js
file.
Run the tests and see how many fail. Use the descriptive feedback from your
it
statements to find and fix the errors in launchOutput
.
Note: You could just cheat and compare your correct code to the flawed sample, but the point of this mission is to give you more practice interpreting and using test results. To gain the most benefit, honor the spirit of this task.