RSpec::LetAs
Right assignment extension for RSpec
using RSpec::LetAs
RSpec.describe 'answer' do
before do
42.let_as :answer
end
example do
expect(answer).to eq(42)
end
end
Motivation
When testing a Rails application with RSpec, I am often faced with the need to arrange large object graph. And since I also need to be able to access specific nodes in the graph, I have to create edges one by one.
RSpec.describe MyApp do
let(:user) { create(:user) }
let(:post) { create(:post, user: user) }
let(:comment_1) { create(:comment, post: post) }
let(:comment_2) { create(:comment, post: post) }
# ...
end
It is often difficult to imagine the resulting graph from such code. So RSpec::LetAs makes it possible to export the necessary references while building the graph hierarchically.
using RSpec::LetAs
RSpec.describe MyApp do
before do
create(:user, posts: [
build(:post, comments: [
build(:comment).let_as(:comment_1),
build(:comment).let_as(:comment_2)
]).let_as(:post)
]).let_as(:user)
end
# ...
end
Usage
It is implemented as a refinement and should be passed as an argument to Module#using
.
using RSpec::LetAs
Then Object#let_as
will be defined in the scope of the file or class. It can be used in example group (describe
/ context
) or example (example
/ it
/ before
/ let
/ etc.).
using RSpec::LetAs
RSpec.describe 'let_as' do
1.let_as :one
before do
2.let_as :two
end
let!(:_three) { 3.let_as(:three) }
def let_four
4.let_as :four
end
example do
let_four
5.let_as :five
expect(one).to eq(1)
expect(two).to eq(2)
expect(three).to eq(3)
expect(four).to eq(4)
expect(five).to eq(5)
end
end
Installation
Add this line to your application's Gemfile:
gem 'rspec-let_as'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install rspec-let_as
License
The gem is available as open source under the terms of the MIT License.