Even with some advice from other sites, we had trouble getting Mocha testing to work well in Windows. Well, we could get tests to run, but inefficiently and error-prone from a developer perspective. Our solutions are cross-platform, so we wanted to use a consistent mechanism for Windows and Linux (and assume Linux covers us well on Mac OS X).
Most of the suggestions from other sites worked, so we’ll just walk through them quickly. But getting test execution via makefiles was a headache. Aside: The “Unix Way” uses makefiles for almost everything. The Unix Way for a developer to execute Mocha tests is to simply type ‘make test‘ Without getting into any philosophical or pragmatic rationales, this is the best way we’ve found for cross-platform Mocha testing.
Setting Up Your Environment
We’ll assume that you already have Node configured and working. The first step is to get Mocha installed and configured. As with most Node packages, installing Mocha is as easy as
npm install mocha
Once installed, Mocha shows up in the list of packages
Now you’re ready to create tests. Just follow the instructions, 1. 2. 3. Mocha!, on Mocha’s GitHub site. Their instructions are written for a Unix-like environment (.e.g., “$EDITOR test/test.js”), but translation is simply:
- Create a test directory
- Run Mocha
Oops! Step 3 doesn’t work on Windows like they expect it will on Linux. Yes, you could add Mocha to PATH, but that’s not the better solution – especially since we aim to use make to run the tests. So we’ll just skip step 3 and get help from Alex Young’s excellent post, Testing With Mocha. You can skip the first bit about creating a package.json file and using npm to install Mocha. (Eventually you’re going to want to leverage the power of the Node Package Manager!)
Just copy Alex’s simple, 3-line makefile to your directory (the parent of the test directory where you stored test.js). If you were using a “typical” unix developer environment, you could simply run the tests in test.js by using make:
In most Windows developer environments, however, makeeither doesn’t exist or isn’t going to work correctly. Other have written, for example, that Visual Studio’s nmake.exe isn’t a good proxy for make in this case. As you search for how to remedy this situation, you’re likely to come across Mocha requires make. Can’t find a make.exe that works on Windows on StackOverflow.com. The elements of this post that proved to be helpful are:
- Install Cygwin
- Alias make to Cygwin’s make.exe ([install location]\cygwin\bin\make.exe)
- (Optional) Use the makefile template from Richard Turner’s response
Now you should be able to make test and see the test run, right? Well, not so fast professor. Cygwin’s make.exe conforms to some White Space Persnicketiness Specification. We thought surely we were ready to execute our tests, but kept suffering make errors about “missing separator.”
Well, sir, that’s what we call a helpless error. It’s an error alright, but sure isn’t helpful. It turns out, however, that had we been steeped in unix-land makefiles, we might know that white space matters. That is to say that make treats a series of spaces differently than tabs. If your favorite editor is converting tabs to spaces, then make complains of “missing separator.” [UPDATE: some have suggested that GNU’s Make for Windows handles tabs or spaces.]
Ok, we’re almost there. You’ll need to configure your editor to keep tabs rather than convert them to spaces. Ideally, your editor will also support writing files with unix-style line endings, LF (\n) rather than CRLF (\r\n) typically used on Windows. Below is an example of how to configure Notepad++.
Notepad++ Configuration to Keep Make Happy
Since make doesn’t like tabs to be converted to spaces, we change our Notepad++ settings to save the tabs rather than convert them. Visual Studio and other developer-oriented text editors have similar settings. In Notepad++ select Preferences from the Settings menu, and then the dialog tab for Language Menu/Tab Settings. Select Makefile in the Tab Settings, listbox on the right; turn Use default value and Replace by space off. After you save these settings, you’ll also need to replace the spaces in your makefile with tabs. For example, we replaced the beginning spaces on Line 2 below with a beginning tab. Just save your changes, and you should be able to make test successfully.
Whew! That wraps it up. Now your developers should be able to use make test in Windows, Linux and Mac environments. One less difference to remember between platforms means one more boost to developer productivity.
We hope this is helpful to you. Feel free to leave comments if this works for you, if it doesn’t, etc.