70 lines
2.0 KiB
Markdown
70 lines
2.0 KiB
Markdown
|
---
|
||
|
title: "Testing $HOME with Cucumber and Aruba"
|
||
|
created_at: 2014-04-15 21:42:43 +0200
|
||
|
kind: article
|
||
|
published: true
|
||
|
tags:
|
||
|
- programming
|
||
|
- cucumber
|
||
|
- aruba
|
||
|
summary: |
|
||
|
Cucumber and Aruba make it awesome to write acceptance tests for your
|
||
|
command line programs. But how do you test your program interacting with
|
||
|
files from a user's <code>$HOME</code> directory?
|
||
|
---
|
||
|
[Cucumber][1] and [Aruba][2] are awesome tools to write acceptance tests for your command line application. The allow you to do things like this:
|
||
|
|
||
|
```
|
||
|
:::gherkin
|
||
|
Scenario: Exit with 0 when no examples are run
|
||
|
Given a file named "a_no_examples_spec.rb" with:
|
||
|
"""ruby
|
||
|
"""
|
||
|
When I run `rspec a_no_examples_spec.rb`
|
||
|
Then the exit status should be 0
|
||
|
And the output should contain "0 examples"
|
||
|
```
|
||
|
_This example was taken rspec-core._
|
||
|
|
||
|
Aruba basically does three things for you:
|
||
|
|
||
|
* Create and inspect files and directories
|
||
|
* Run commands
|
||
|
* Inspect output and exit status
|
||
|
|
||
|
## The problem
|
||
|
|
||
|
Now, if you are writing a CLI that interacts with a configuration file in the user's home directory, you'd write a cucumber like this:
|
||
|
|
||
|
```
|
||
|
:::gherkin
|
||
|
Scenario: use .my-app configuration
|
||
|
Given a file named "~/.my-app" with:
|
||
|
"""
|
||
|
awesome_enabled: true
|
||
|
"""
|
||
|
When I run `my-app`
|
||
|
Then the output should contain "AWESOME"
|
||
|
```
|
||
|
|
||
|
But how does your app and Aruba differentiate between this generated test file and your actual configration file in your home directory? It doens't.
|
||
|
|
||
|
## The answer
|
||
|
|
||
|
The solution is quite easy and elegant, in your `Before` set the `$HOME` environment variable to a custom location inside the `tmp/aruba` directory.
|
||
|
|
||
|
In `features/support/env.rb`:
|
||
|
|
||
|
```
|
||
|
:::ruby
|
||
|
Before do
|
||
|
set_env 'HOME', File.expand_path(File.join(current_dir, 'home'))
|
||
|
FileUtils.mkdir_p ENV['HOME']
|
||
|
end
|
||
|
```
|
||
|
|
||
|
This will set `$HOME` to `tmp/aruba/home` in the context of your cucumbers (and execute binary). `current_dir` automatically points to the right location for the aruba temporary directory.
|
||
|
|
||
|
[1]: https://github.com/cucumber/cucumber
|
||
|
[2]: https://github.com/cucumber/aruba
|