As a novice Ruby programmer, I still dont understand a lot of things.  However  I have to admit Ruby is really flexible.

Ruby has a lot of usable libraries which are distributed by RubyGems package manager, hence the library format is called gem. It is comparable to NuGet in .NET and npm for Node.js.

One of the several libraries that impressed me is RSpec, which is a BDD library. It has similarities with Mocha and its addons (like should.js) in JavaScript world, however Ruby language construct allows more flexibilities.

I like the way the expectation construct works:

actual.should be >= expected

actual.should =~ /regex/

expect { my_class.process() }.to raise_error(ErrorClass)


Stubbing method is also quite easy, even for ActiveRecord classes. Assume that Student is ActiveRecord class, we can do it directly like this

Student.stub(:find){fake_students}

If we use Entity Framework / other ORMs in C# we will need another layer to make it easier for testing. It is more of limitation of C# as static typed language.

Checking whether a method is triggered is also simple. We will use this dummy scenario where Agent instance will raise exception if its id is invalid.

class Validator
    def validate(input)
        true
    end
end

class Agent
    attr_accessor :code, :validator

    def initialize(args = nil)
        if args
            args.each do |k,v|
                instance_variable_set("@#{k}", v) unless v.nil?
            end
        end
    end

    def check_state
        state = self.validator.validate(self.code)
        raise "Invalid" unless state
    end
end

describe Agent do
    describe "#check_state" do
        it "should raise error if code is invalid" do
            validator = double('validator')
            code = "008"
            agent = Agent.new(:code => code, :validator => validator)
            validator.should_receive(:validate).with(code).and_return(false)
            expect {agent.check_state}.to raise_error
        end
    end
end

An expert programmer once said to me “if all you have is a hammer, everything looks like a nail “, to encourage me learning different programming language. It was Python at that time.

Well now I have much more respect for Ruby and Python, but it doesn’t change the fact that C# is an awesome language!