We now know how to use conditionals. Now, let's use conditionals to test our code for correctness. This is your first step towards how professional developers write software. Professional developers test their code for correctness. Instead of constantly clicking around their applications, most developers write additional code, called tests that ensure their code is outputting the right things. In fact, they may even write tests first before they actually do any work towards a project to help ensure the code they write does what they expect it to do!
We will eventually explain how to use the professional testing tools but first, let's go over a simple example.
After you open this lesson in the IDE, in the js folder, double-click on
index.js. You'll see some basic code:
// ./js/index.js
var name = "Joe"
var height = "74"
// Don't worry about this
module.exports = { name, height
}First of all, don't worry about the module.exports stuff right now, we'll get
to that later. You've seen the rest of this stuff before but let's review. This
assigns "Joe" to the name variable using the assignment operator (=). It
also assigns "74" to height. Both "Joe" and "74" are Strings. We know
that because they are wrapped in quotes. We have our code, but we don't have our
tests. Let's write a test right below the var height = "74" line to check that
name is equal to "Susan". That should look something like this:
if (name === "Susan") {
console.log("The name is correct")
}Write that, and then run your index.js file with node js/index.js in the
terminal. You'll see nothing printed out. That's because our name variable
doesn't equal "Susan". Let's put in an else statement that prints "Expected the name to be Susan". Give it a try on your own.
OK, you gave it a try, now let's look at the solution:
if (name === "Susan") {
console.log("The name is correct")
} else {
console.log("Expected the name to be Susan")
}See what we did there? Great! Now run your code again by typing
node js/index.js in the terminal and you should get
Expected the name to be Susan printed out. Let's fix our name variable to
equal "Susan". Modify the first line to say:
var name = "Susan"Re-run your code and boom! you did it :)
In later steps, we'll be doing our testing in other files. So, for now, let's revert index.js to its original state. Make sure the index.js file is saved and that it looks like this:
var name = "Joe"
var height = "74"
// Don't worry about this
module.exports = { name, height
}As you can probably imagine, a large application will have many tests. Average sized applications will have thousands of tests. It gets a bit confusing to have the application code mixed in with your test code. We want to separate them out so it's not a pain to sift through our files.
Let's open up another JavaScript file and play around with separating things
out. There is a blank JS file included in this lab called other_file.js
located in the js folder. Double click on that and you'll see a blank file.
Let's say we wanted to console.log the name variable from our index.js
file. Seems fairly easy. Go ahead and type console.log(name). Now let's run
this new file by typing node js/other_file.js in our terminal. BOOM! You'll get
an error that looks like this:
/home/jmburges/code/labs/js-functions-lab/test.js:1
(function (exports, require, module, __filename, __dirname) { console.log(name)
^
ReferenceError: name is not defined
at Object.<anonymous> (/home/jmburges/code/labs/js-functions-lab/test.js:1:75)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:393:7)
at startup (bootstrap_node.js:150:9)
at bootstrap_node.js:508:3The important line here is the ReferenceError: name is not defined line. That
says that our name variable doesn't exist in the other_file.js file. That
makes sense. In other_file.js we never write the line of code to create
name. We have the line var name = "Joe" in index.js. We need to tell
other_file.js about the existence of index.js! Let's do that by replacing
the contents of other_file.js with the following line of code:
var index = require("./index.js")This tells javascript to load the index.js file and put its contents inside of
the index variable within other_file.js. That's a bit confusing, but it's
fairly straight forward to use. Thanks to require(), we now have access to the
variables we exported from index.js, including name. To access name within
other_file.js, we can simply refer to the name property of the index
variable, which, again, is where we used require() to store the contents of
index.js. Let's add the following line to other_file.js:
var index = require("./index.js")
console.log(index.name)Give that a run by typing node js/other_file.js and you should see the name
getting printed out. Awesome!
You now know how multiple files interact as well as how if statements work.
Now, you have to write your code to match some specific tests. Open up
js/tests.js and you will see two if statements. Let's give this a run to
start things off by typing node js/tests.js. You should get two messages:
Expected: Susan, Received: Joe
Expected: 70, Received: 74Now, it's your job to modify index.js so that when you run node js/tests.js
the messages you see logged to the console are:
The name is correct
The height is correctNote: Capitalization matters. Also, whether or not you use a String or Number matters. Numbers don't have any quotes around them, Strings do have quotes around them!
When you've finished your solution, and the tests show the output above, run
learn submit from the console to submit your solution.