DuckTesting
Simple data type testing tool
Usage
YARD
require "duck_testing"
DuckTesting::YARD.apply
This code automatically generates duck_testing module for all classes in {lib,app}/**/*.rb
and prepends them into corresponding classes. In most cases, you might put the code in spec/spec_helper.rb
or test/test_helper.rb
.
You can include and exclude custom paths by using paths
and excluded
arguments. For instance, excluding Rails' controllers and views is written as follows:
DuckTesting::YARD.apply(excluded: [%r{^app/(controllers|views)}])
Manually
Suppose there are a class and corresponding duck_testing module:
require "duck_testing"
class Foo
# @param [Fixnum, Float]
# @return [Fixnum, Float]
def double(x)
x * 2
end
end
module FooDuckTesting
def double(x)
tester = DuckTesting::Tester.new(self, "double")
tester.test_param(x, [
DuckTesting::Type::ClassInstance.new(Fixnum),
DuckTesting::Type::ClassInstance.new(Float)
])
tester.test_return(super, [
DuckTesting::Type::ClassInstance.new(Fixnum),
DuckTesting::Type::ClassInstance.new(Float)
])
end
end
Now you can activate type testing by prepending duck_testing module into the class:
before = Foo.new
before.double("2")
# => "22"
Foo.send(:prepend, FooDuckTesting)
after = Foo.new
after.double(2)
# => 4
after.double(2.0)
# => 4.0
after.double("2")
# ContractViolationError: Contract violation for argument Foo#double