2018-08-18 21:33:20 +00:00
|
|
|
Spectator
|
|
|
|
=========
|
|
|
|
|
2018-09-27 20:57:58 +00:00
|
|
|
Spectator is a fully-featured spec-based test framework for Crystal.
|
|
|
|
It provides more functionality from [RSpec](http://rspec.info/)
|
2018-08-30 21:09:29 +00:00
|
|
|
than the built-in Crystal [Spec](https://crystal-lang.org/api/latest/Spec.html) utility.
|
2018-09-27 20:57:58 +00:00
|
|
|
Additionally, Spectator provides extra features to make testing easier and more fluent.
|
2018-08-18 21:33:20 +00:00
|
|
|
|
2018-11-02 20:32:36 +00:00
|
|
|
**Goal:**
|
|
|
|
|
|
|
|
Spectator is designed to:
|
|
|
|
|
|
|
|
- Reduce complexity of test code.
|
|
|
|
- Remove boilerplate from tests.
|
|
|
|
- Lower the difficulty of writing non-trivial tests.
|
|
|
|
- Provide an elegant syntax that is easy to read and understand.
|
|
|
|
- Provide common utilities that the end-user would otherwise need to write.
|
|
|
|
|
2018-08-18 21:33:20 +00:00
|
|
|
Installation
|
|
|
|
------------
|
|
|
|
|
|
|
|
Add this to your application's `shard.yml`:
|
|
|
|
|
|
|
|
```yaml
|
2018-09-27 21:02:50 +00:00
|
|
|
development_dependencies:
|
2018-08-18 21:33:20 +00:00
|
|
|
spectator:
|
|
|
|
gitlab: arctic-fox/spectator
|
|
|
|
```
|
|
|
|
|
|
|
|
Usage
|
|
|
|
-----
|
|
|
|
|
2018-08-30 21:09:29 +00:00
|
|
|
If it doesn't exist already, create a `spec/spec_helper.cr` file.
|
|
|
|
In it, place the following:
|
|
|
|
|
2018-08-18 21:33:20 +00:00
|
|
|
```crystal
|
|
|
|
require "spectator"
|
2018-08-30 21:09:29 +00:00
|
|
|
require "../src/*"
|
|
|
|
```
|
|
|
|
|
|
|
|
This will include Spectator and the source code for your shard.
|
|
|
|
Now you can start writing your specs.
|
|
|
|
The syntax is the same as what you would expect from modern RSpec.
|
|
|
|
The "expect" syntax is recommended and the default, however the "should" syntax is also available.
|
|
|
|
Your specs must be wrapped in a `Spectator.describe` block.
|
2018-09-27 21:02:50 +00:00
|
|
|
All other blocks inside the top-level block may use `describe` and `context` without the `Spectator.` prefix.
|
2018-08-30 21:09:29 +00:00
|
|
|
|
|
|
|
Here's a minimal spec to demonstrate:
|
|
|
|
|
|
|
|
```crystal
|
|
|
|
require "./spec_helper"
|
|
|
|
|
|
|
|
Spectator.describe String do
|
|
|
|
subject { "foo" }
|
|
|
|
|
|
|
|
describe "#==" do
|
|
|
|
context "with the same value" do
|
|
|
|
let(value) { subject.dup }
|
|
|
|
|
|
|
|
it "is true" do
|
|
|
|
is_expected.to eq(value)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with a different value" do
|
|
|
|
let(value) { "bar" }
|
|
|
|
|
|
|
|
it "is false" do
|
|
|
|
is_expected.to_not eq(value)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2018-08-18 21:33:20 +00:00
|
|
|
```
|
|
|
|
|
2018-08-30 21:09:29 +00:00
|
|
|
If you find yourself trying to shoehorn in functionality
|
2018-09-27 21:02:50 +00:00
|
|
|
or unsure how to write a test, please create an [issue](https://gitlab.com/arctic-fox/spectator/issues/new) for it.
|
2018-11-02 20:32:36 +00:00
|
|
|
We want to make it as easy as possible to write specs and keep your code clean.
|
|
|
|
We may come up with a solution or even introduce a feature to support your needs.
|
2018-08-30 21:09:29 +00:00
|
|
|
|
|
|
|
NOTE: Due to the way this shard uses macros,
|
2018-09-27 21:02:50 +00:00
|
|
|
you may find that some code you would expect to work, or works in other spec libraries, creates syntax errors.
|
2018-11-02 20:32:36 +00:00
|
|
|
If you run into this, please create an issue so that we may help you resolve it.
|
2018-08-30 21:09:29 +00:00
|
|
|
|
|
|
|
Features
|
|
|
|
--------
|
|
|
|
|
|
|
|
TODO: Document the features and give brief usage examples.
|
2018-08-18 21:33:20 +00:00
|
|
|
|
|
|
|
Development
|
|
|
|
-----------
|
|
|
|
|
2018-08-30 21:09:29 +00:00
|
|
|
This shard is under heavy development and is not ready to be used for production.
|
|
|
|
|
|
|
|
### Feature Progress
|
|
|
|
|
2018-08-30 21:15:01 +00:00
|
|
|
In no particular order, features that have been implemented and are planned:
|
|
|
|
|
|
|
|
- [ ] DSL
|
|
|
|
- [X] `describe` and `context` blocks
|
2018-09-04 22:59:59 +00:00
|
|
|
- [X] Contextual values with `let`, `let!`, `subject`, `described_class`
|
2019-01-02 19:45:46 +00:00
|
|
|
- [X] Test multiple and generated values - `sample`, `random_sample`
|
2019-01-09 22:10:57 +00:00
|
|
|
- [X] Concise syntax - `given`
|
2018-09-15 15:59:55 +00:00
|
|
|
- [X] Before and after hooks - `before_each`, `before_all`, `after_each`, `after_all`, `around_each`
|
2019-01-23 22:15:01 +00:00
|
|
|
- [X] Pre- and post-conditions - `pre_condition`, `post_condition`
|
2018-09-22 18:35:44 +00:00
|
|
|
- [ ] Other hooks - `on_success`, `on_failure`, `on_error`
|
2019-01-09 22:10:57 +00:00
|
|
|
- [X] One-liner syntax
|
2018-09-27 22:11:45 +00:00
|
|
|
- [X] Should syntax - `should`, `should_not`
|
2018-09-13 01:16:41 +00:00
|
|
|
- [X] Helper methods and modules
|
2018-09-13 01:11:36 +00:00
|
|
|
- [ ] Aliasing - custom example group types with preset attributes
|
2018-09-15 16:36:20 +00:00
|
|
|
- [X] Pending tests - `pending`
|
2018-09-13 01:11:36 +00:00
|
|
|
- [ ] Shared examples - `behaves_like`, `include_examples`
|
2018-08-30 21:15:01 +00:00
|
|
|
- [ ] Matchers
|
2019-02-01 22:40:43 +00:00
|
|
|
- [X] Equality matchers - `eq`, `ne`, `be ==`, `be !=`
|
2019-02-02 02:10:28 +00:00
|
|
|
- [X] Comparison matchers - `lt`, `le`, `gt`, `ge`, `be <`, `be <=`, `be >`, `be >=`, `be_within[.of]`, `be_close`
|
2019-02-01 22:40:43 +00:00
|
|
|
- [ ] Type matchers - `be_a`, `respond_to`
|
2019-02-01 23:25:45 +00:00
|
|
|
- [ ] Collection matchers - `contain`, `have`, `contain_exactly[.in_order|.in_any_order]`, `match_array[.in_order|.in_any_order]`, `start_with`, `end_with`, `be_empty`, `has_key`, `has_value`, `all`, `all_satisfy`
|
2019-02-01 22:40:43 +00:00
|
|
|
- [X] Truthy matchers - `be`, `be_true`, `be_truthy`, `be_false`, `be_falsey`, `be_nil`
|
|
|
|
- [ ] Error matchers - `raise_error`
|
|
|
|
- [ ] Yield matchers - `yield_control[.times]`, `yield_with_args[.times]`, `yield_with_no_args[.times]`, `yield_successive_args`
|
|
|
|
- [ ] Output matchers - `output[.to_stdout|.to_stderr]`
|
|
|
|
- [ ] Misc. matchers - `exist`, `match`, `satisfy`, `change[.by|.from[.to]|.to|.by_at_least|.by_at_most]`, `have_attributes`
|
|
|
|
- [ ] Expectation combining - `and`, `or`
|
2018-08-30 21:15:01 +00:00
|
|
|
- [ ] Runner
|
|
|
|
- [ ] Fail fast
|
2018-09-13 01:11:36 +00:00
|
|
|
- [ ] Test filtering - by name, context, and tags
|
2018-08-30 21:15:01 +00:00
|
|
|
- [ ] Fail on no tests
|
|
|
|
- [ ] Randomize test order
|
2018-09-13 01:11:36 +00:00
|
|
|
- [ ] Dry run - for validation and checking formatted output
|
|
|
|
- [ ] Config block in `spec_helper.cr`
|
|
|
|
- [ ] Config file - `.rspec`
|
|
|
|
- [ ] Reporter and formatting
|
|
|
|
- [ ] RSpec/Crystal Spec default
|
|
|
|
- [ ] JSON
|
|
|
|
- [ ] JUnit
|
2018-08-30 21:09:29 +00:00
|
|
|
|
|
|
|
### How it Works
|
|
|
|
|
|
|
|
This shard makes extensive use of the Crystal macro system to build classes and modules.
|
|
|
|
Each `describe` and `context` block creates a new module nested in its parent.
|
|
|
|
The `it` block creates a class derived from an `Example` class.
|
|
|
|
An instance of the example class is created to run the test.
|
|
|
|
Each example class includes a context module, which contains all test values and hooks.
|
2018-08-18 21:33:20 +00:00
|
|
|
|
|
|
|
Contributing
|
|
|
|
------------
|
|
|
|
|
|
|
|
1. Fork it (<https://gitlab.com/arctic-fox/spectator/fork/new>)
|
|
|
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
|
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
|
|
4. Push to the branch (`git push origin my-new-feature`)
|
|
|
|
5. Create a new Merge Request
|
|
|
|
|
|
|
|
Contributors
|
|
|
|
------------
|
|
|
|
|
|
|
|
- [arctic-fox](https://gitlab.com/arctic-fox) Michael Miller - creator, maintainer
|