test/all_test.rb in soveran-override-0.0.5 vs test/all_test.rb in soveran-override-0.0.6
- old
+ new
@@ -1,8 +1,8 @@
require 'test/unit'
require 'rubygems'
-require 'shoulda'
+require 'contest'
require File.dirname(__FILE__) + "/../lib/override"
class Foo
def bar
@@ -20,74 +20,181 @@
def == other
bar == other.bar
end
end
+class Callable
+ def to_proc
+ lambda do |name|
+ "Hello #{name}"
+ end
+ end
+end
+
class TestOverride < Test::Unit::TestCase
context "dealing with arguments" do
setup do
@foo = Foo.new
override(@foo, :bar => "Hello")
end
- should "work without arguments" do
+ test "work without arguments" do
assert_equal "Hello", @foo.bar
end
- should "discard arguments" do
+ test "discard arguments" do
assert_equal "Hello", @foo.bar(1)
end
end
context "accepting different return values" do
setup do
@foo = Foo.new
@foo2 = Foo.new
end
- should "work for string returns" do
+ test "work for string returns" do
override(@foo, :bar => "Hello")
assert_equal "Hello", @foo.bar
end
- should "work for numeric returns" do
+ test "work for numeric returns" do
override(@foo, :bar => 23)
assert_equal 23, @foo.bar
end
- should "work for object returns" do
+ test "work for object returns" do
override(@foo, :bar => @foo2)
assert_equal @foo2, @foo.bar
end
end
context "working with methods that acepted attributes or blocks" do
setup do
@foo = Foo.new
end
- should "work for methods that used to receive blocks" do
+ test "work for methods that used to receive blocks" do
override(@foo, :baz => "Hey!")
assert_equal "Hey!", @foo.baz { |x| x }
end
- should "work for methods that used to receive arguments" do
+ test "work for methods that used to receive arguments" do
override(@foo, :qux => "Yay!")
assert_equal "Yay!", @foo.qux(1, 2, 3)
end
end
context "rewriting multiple methods at once" do
- should "override all the passed methods" do
+ test "override all the passed methods" do
override(@foo, :bar => 1, :baz => 2, :qux => 3)
assert_equal 1, @foo.bar
assert_equal 2, @foo.baz
assert_equal 3, @foo.qux
end
end
context "chaining successive calls" do
- should "return the object and allow chained calls" do
+ test "return the object and allow chained calls" do
assert_equal 1, override(@foo, :bar => 1).bar
+ end
+ end
+
+ context "dealing with a proc as the result value" do
+ test "uses the proc as the body of the method" do
+ override(@foo, :bar => lambda { |name| "Hello #{name}" })
+ assert_equal "Hello World", @foo.bar("World")
+ end
+ end
+
+ context "using assert raise with lambdas" do
+ setup do
+ class User
+ def name
+ "Michel"
+ end
+ end
+
+ user = User.new
+ override(@foo, :bar => lambda { |id| raise ArgumentError unless id == 1; user })
+ end
+
+ test "lambdas should be able to raise exceptions" do
+ assert_raise ArgumentError do
+ @foo.bar(2)
+ end
+
+ assert_nothing_raised do
+ @foo.bar(1)
+ end
+
+ assert_equal "Michel", @foo.bar(1).name
+ end
+ end
+
+ context "documenting a gotcha with lambdas" do
+ setup do
+ name = "Michel"
+ @name = "Michel"
+ override(@foo, :bar => lambda { name })
+ override(@foo, :baz => lambda { @name })
+ end
+
+ test "succeeds when the lambda returns a local variable" do
+ assert_equal "Michel", @foo.bar
+ end
+
+ test "fails when the lambda is supposed to return an instance variable" do
+ assert_equal nil, @foo.baz
+ end
+ end
+
+ context "using objects that respond to to_proc" do
+ setup do
+ override(@foo, :bar => Callable.new)
+ end
+
+ test "coerces the value into a proc" do
+ assert_equal "Hello World", @foo.bar("World")
+ end
+ end
+
+ context "supporting procs as return values" do
+ setup do
+ override(@foo, :bar => lambda { lambda { "Hey!" } })
+ end
+
+ test "returns a lambda if it's wraped inside a proc" do
+ assert_equal "Hey!", @foo.bar.call
+ end
+ end
+
+ context "setting expectations" do
+ setup do
+ expect(@foo, :bar, :return => true, :params => ["Michel", 32])
+ end
+
+ test "raises an error if expectations are not met" do
+ assert_raise ArgumentError do
+ @foo.bar "Michel", 31
+ end
+ end
+
+ test "succeeds if expectations are met" do
+ assert_nothing_raised do
+ @foo.bar "Michel", 32
+ end
+ end
+ end
+
+ context "setting expectations with hashes in the param list" do
+ setup do
+ expect(@foo, :bar, :return => true, :params => ["Michel", { :include => :friendships, :select => "name" }])
+ end
+
+ test "succeeds if expectations are met" do
+ assert_nothing_raised do
+ @foo.bar "Michel", { :select => "name", :include => :friendships, :select => "name" }
+ end
end
end
end