mikespokefire / rspec-virtus Goto Github PK
View Code? Open in Web Editor NEWSimple RSpec matchers for Virtus objects
License: MIT License
Simple RSpec matchers for Virtus objects
License: MIT License
The last virtus
version is 1.0.3
[1], but this gem depends on ~> 0.5
[2].
[1] https://github.com/solnic/virtus/blob/master/lib/virtus/version.rb
[2] https://github.com/mikespokefire/rspec-virtus/blob/master/rspec-virtus.gemspec#L21
Currently We have to use old syntax for matching:
it { expect(described_class).to have_attribute(:title) }
It would be much nicer if we could keep the old implementation, as well as using the new and improved version:
it { is_expected.to have_attribute(:title) }
With the current version it is not possible to test attribute type if attribute type is boolean.
The current implementation uses method Attribute#primitive
to fetch and compare types, which in case of Boolean returns BasicObject (because ruby does not have a corresponding type) and thus fails.
class Authorization
include Virtus.model
attribute :status, String
attribute :approved, Boolean
attribute :pending
end
it { expect(described_class).to have_attribute(:approved).of_type(described_class::Boolean) } # fails
it { expect(described_class).to have_attribute(:approved).of_type(Virtus::Attribute::Boolean) } # fails
it { expect(described_class).to have_attribute(:approved).of_type(Axiom::Types::Boolean) } #fails
Authorization.attribute_set['status'] #=> #<Virtus::Attribute type=Axiom::Types::String (String)
Authorization.attribute_set['status'].primitive #=> String
Authorization.attribute_set['approved'] #=> #<Virtus::Attribute::Boolean type=Axiom::Types::Boolean (BasicObject) ...
Authorization.attribute_set['approved'].primitive #=> BasicObject
Authorization.attribute_set['pending'] #=> #<Virtus::Attribute type=Axiom::Types::Object (BasicObject)
Authorization.attribute_set['pending'].primitive #=> BasicObject
As a solution I suggest to update method type_correct?
to check if attribute is instance of given type.
module RSpec
module Virtus
class Matcher
def type_correct?
if @options[:member_type]
member_type == @options[:member_type] && (attribute_type == @options[:type] || attribute.is_a?(@options[:type]))
elsif @options[:type]
attribute_type == @options[:type] || attribute.is_a?(@options[:type])
else
true
end
end
end
end
end
Problem was introduced with this modification on equalizer gem:
Failing specs:
$ rspec
Randomized with seed 31093
FF........F..F...
Failures:
1) DummyPost should have body defined
Failure/Error: it { expect(described_class).to have_attribute(:body).of_type(String) }
NoMethodError:
undefined method `first' for nil:NilClass
# /home/embs/.rvm/gems/ruby-2.1.2@rspec-virtus/gems/equalizer-0.0.11/lib/equalizer.rb:117:in `=='
# ./lib/rspec-virtus/matcher.rb:47:in `!='
# ./lib/rspec-virtus/matcher.rb:47:in `attribute_exists?'
# ./lib/rspec-virtus/matcher.rb:21:in `matches?'
# ./spec/acceptance/rspec-virtus_spec.rb:14:in `block (2 levels) in <top (required)>'
2) DummyPost should have title defined
Failure/Error: it { expect(described_class).to have_attribute(:title) }
NoMethodError:
undefined method `first' for nil:NilClass
# /home/embs/.rvm/gems/ruby-2.1.2@rspec-virtus/gems/equalizer-0.0.11/lib/equalizer.rb:117:in `=='
# ./lib/rspec-virtus/matcher.rb:47:in `!='
# ./lib/rspec-virtus/matcher.rb:47:in `attribute_exists?'
# ./lib/rspec-virtus/matcher.rb:21:in `matches?'
# ./spec/acceptance/rspec-virtus_spec.rb:13:in `block (2 levels) in <top (required)>'
3) RSpec::Virtus::Matcher#matches? successful match on attribute name
Failure/Error: subject { instance.matches?(actual) }
NoMethodError:
undefined method `first' for nil:NilClass
# /home/embs/.rvm/gems/ruby-2.1.2@rspec-virtus/gems/equalizer-0.0.11/lib/equalizer.rb:117:in `=='
# ./lib/rspec-virtus/matcher.rb:47:in `!='
# ./lib/rspec-virtus/matcher.rb:47:in `attribute_exists?'
# ./lib/rspec-virtus/matcher.rb:21:in `matches?'
# ./spec/lib/rspec-virtus/matcher_spec.rb:16:in `block (3 levels) in <top (required)>'
# ./spec/lib/rspec-virtus/matcher_spec.rb:20:in `block (4 levels) in <top (required)>'
4) RSpec::Virtus::Matcher#matches? successful match on attribute name and type
Failure/Error: subject { instance.matches?(actual) }
NoMethodError:
undefined method `first' for nil:NilClass
# /home/embs/.rvm/gems/ruby-2.1.2@rspec-virtus/gems/equalizer-0.0.11/lib/equalizer.rb:117:in `=='
# ./lib/rspec-virtus/matcher.rb:47:in `!='
# ./lib/rspec-virtus/matcher.rb:47:in `attribute_exists?'
# ./lib/rspec-virtus/matcher.rb:21:in `matches?'
# ./spec/lib/rspec-virtus/matcher_spec.rb:16:in `block (3 levels) in <top (required)>'
# ./spec/lib/rspec-virtus/matcher_spec.rb:28:in `block (4 levels) in <top (required)>'
Finished in 0.00842 seconds (files took 0.13039 seconds to load)
17 examples, 4 failures
Failed examples:
rspec ./spec/acceptance/rspec-virtus_spec.rb:14 # DummyPost should have body defined
rspec ./spec/acceptance/rspec-virtus_spec.rb:13 # DummyPost should have title defined
rspec ./spec/lib/rspec-virtus/matcher_spec.rb:20 # RSpec::Virtus::Matcher#matches? successful match on attribute name
rspec ./spec/lib/rspec-virtus/matcher_spec.rb:28 # RSpec::Virtus::Matcher#matches? successful match on attribute name and type
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.