Skip to content

Add support for MiniTest #36

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 77 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -310,10 +310,86 @@ You can also remember JSON inline:
Then the JSON response at "0/first_name" should be %{FIRST_NAME}
```

MiniTest
--------

json_spec matchers can be used in MiniTest tests. To use json_spec in your tests you must use the minitest-matchers gem. In your `test_helper.rb` you must:

```ruby
require "minitest/autorun"
require "minitest/matchers"
require "json_spec"

class MiniTest::Unit::TestCase
include JsonSpec::Matchers
end
```

The matchers are now available in MiniTest's spec DSL as follows:

```ruby
describe User, :to_json do
let(:user) { User.create! first_name: "Steve", last_name: "Richert" }
let(:names) { %({"first_name":"Steve","last_name":"Richert"}) }

it "includes names" do
user.to_json.must be_json_eql(names).excluding("friends")
end

it "includes the ID" do
user.to_json.must have_json_path("id")
user.to_json.must have_json_type(Integer).at_path("id")
end

it "includes friends" do
user.to_json.must have_json_size(0).at_path("friends")

friend = User.create! first_name: "Catie", last_name: "Richert"
user.friends << friend

user.to_json.must have_json_size(1).at_path("friends")
user.to_json.must include_json(friend.to_json).at_path("friends")
end
end
```

The matchers are also available through MiniTest's classic assertions as follows:

```ruby
class UserToJsonTest < MiniTest::Unit::TestCase
def setup
@user = User.create! first_name: "Steve", last_name: "Richert"
@names = %({"first_name":"Steve","last_name":"Richert"})
end

def test_includes_names
assert_must be_json_eql(@names).excluding("friends"), @user.to_json
end

def test_includes_id
assert_have_json_path @user.to_json, "id"
assert_must have_json_path("id"), @user.to_json

assert_must have_json_type(Integer).at_path("id"), @user.to_json
end

def test_includes_friends
assert_must have_json_size(0).at_path("friends"), @user.to_json

friend = User.create! first_name: "Catie", last_name: "Richert"
@user.friends << friend

assert_must have_json_size(1).at_path("friends"), @user.to_json
assert_must include_json(friend.to_json).at_path("friends"), @user.to_json
end
end
```

### More

Check out the [specs](https://github.com/collectiveidea/json_spec/blob/master/spec)
and [features](https://github.com/collectiveidea/json_spec/blob/master/features) to see all the
and [features](https://github.com/collectiveidea/json_spec/blob/master/features)
and [tests](https://github.com/collectiveidea/json_spec/blob/master/test) to see all the
various ways you can use json_spec.

Contributing
Expand Down
11 changes: 9 additions & 2 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
require "bundler/gem_tasks"
require "rspec/core/rake_task"
require "cucumber/rake/task"
require "rake/testtask"

RSpec::Core::RakeTask.new(:spec)
Cucumber::Rake::Task.new(:cucumber)

task :test => [:spec, :cucumber]
task :default => :test
Rake::TestTask.new do |t|
t.libs << "test" << "lib"
t.test_files = FileList['test/**/*_test.rb']
t.verbose = true
end

task :all => [:spec, :cucumber, :test]
task :default => :all
1 change: 1 addition & 0 deletions features/support/env.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
$: << File.expand_path("../../../lib", __FILE__)

require "rspec"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe this can be removed as well

require "json_spec/cucumber"

JsonSpec.directory = File.expand_path("../../../spec/support/files", __FILE__)
Expand Down
4 changes: 3 additions & 1 deletion json_spec.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@ Gem::Specification.new do |gem|
gem.homepage = "https://github.com/collectiveidea/json_spec"

gem.add_dependency "multi_json", "~> 1.0"
gem.add_dependency "rspec", "~> 2.0"

gem.add_development_dependency "rspec", "~> 2.0"
gem.add_development_dependency "cucumber", "~> 1.1", ">= 1.1.1"
gem.add_development_dependency "rake", "~> 0.9"
gem.add_development_dependency "minitest", "~> 4.0"
gem.add_development_dependency "minitest-matchers", "~> 1.2"

gem.files = `git ls-files`.split($\)
gem.test_files = gem.files.grep(/^(spec|features)\//)
Expand Down
1 change: 0 additions & 1 deletion lib/json_spec.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
require "json"
require "rspec"
require "json_spec/errors"
require "json_spec/configuration"
require "json_spec/exclusion"
Expand Down
14 changes: 12 additions & 2 deletions lib/json_spec/matchers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,19 @@ def have_json_type(type)
def have_json_size(size)
JsonSpec::Matchers::HaveJsonSize.new(size)
end

def self.included base
if base.respond_to? :register_matcher
instance_methods.each do |name|
base.register_matcher name, name
end
end
end
end
end

RSpec.configure do |config|
config.include JsonSpec::Matchers
if defined?(RSpec)
RSpec.configure do |config|
config.include JsonSpec::Matchers
end

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we are expanding these matchers to work elsewhere I'd rather have all configuration taken care either in its own file or required by the user in the test helper.

For rspec we could require the user to simply add this configuration to their spec_helper.
For minitest is there any better way to handle registering methods, so we could take them out of this file?
Are the classic assertions still highly used of could we get by without supporting them?

end
1 change: 1 addition & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
require "rspec"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rspec is not required for the spec_helper

require "json_spec"

RSpec.configure do |config|
Expand Down
29 changes: 29 additions & 0 deletions test/assertions_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
require "test_helper"

class UserToJsonTest < MiniTest::Unit::TestCase
def setup
@user = OpenStruct.new id: 42, first_name: "Steve", last_name: "Richert", friends: []
@names = %({"first_name":"Steve","last_name":"Richert"})
end

def test_includes_names
assert_must be_json_eql(@names).excluding("friends"), @user.to_json
end

def test_includes_id
assert_have_json_path @user.to_json, "id"
assert_must have_json_path("id"), @user.to_json

assert_must have_json_type(Integer).at_path("id"), @user.to_json
end

def test_includes_friends
assert_must have_json_size(0).at_path("friends"), @user.to_json

friend = OpenStruct.new first_name: "Catie", last_name: "Richert"
@user.friends << friend

assert_must have_json_size(1).at_path("friends"), @user.to_json
assert_must include_json(friend.to_json).at_path("friends"), @user.to_json
end
end
38 changes: 38 additions & 0 deletions test/expectations_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
require "test_helper"

describe "User", :to_json do
let(:user) { OpenStruct.new id: 42, first_name: "Steve", last_name: "Richert", friends: [] }
let(:names) { %({"first_name":"Steve","last_name":"Richert"}) }
subject { user.to_json }

it "includes names" do
user.to_json.must be_json_eql(names).excluding("friends")
end

it { must be_json_eql(names).excluding("friends") }
must { be_json_eql(names).excluding("friends") }

it "includes the ID" do
user.to_json.must have_json_path("id")
user.to_json.must have_json_type(Integer).at_path("id")
end

it { must have_json_path("id") }
must { have_json_path("id") }

it { must have_json_type(Integer).at_path("id") }
must { have_json_type(Integer).at_path("id") }

it "includes friends" do
user.to_json.must have_json_size(0).at_path("friends")

friend = OpenStruct.new first_name: "Catie", last_name: "Richert"
user.friends << friend

user.to_json.must have_json_size(1).at_path("friends")
user.to_json.must include_json(friend.to_json).at_path("friends")
end

it { must have_json_size(0).at_path("friends") }
must { have_json_size(0).at_path("friends") }
end
17 changes: 17 additions & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
require "minitest/autorun"
require "minitest/matchers"
require "json_spec"

# Make JsonSpec avaialble in tests
class MiniTest::Unit::TestCase
include JsonSpec::Matchers
end

# Give OpenStruct support for to_json
require "ostruct"

class OpenStruct
def to_json *args
table.to_json *args
end
end