Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Ruby - Et si on écrivait un ORM ? - partie 2

| Comments

Niveau : intermédiaire

Après avoir installé sqlite et la gem sqlite3-ruby, on installe maintenant rspec et on fait passer un premier test pour notre futur Simple ORM.

Pour écrire SORM, on va faire du Test Driven Development, parce que j’ai envie d’encourager les bonnes pratiques ;) Pour les tests j’utiliserai Rspec, puisque c’est le framework que je connais le mieux:

gem install rspec

On écrit un premier test:

sorm_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
require './sorm'

describe SORM do

  class Article < SORM
  end

  describe '.find_by_*' do
    it 'returns an array' do
      article = Article.find_by_whatever('foobar')
      expect(article.class).to eq Array
    end
  end
end

Alors c’est un test un peu foireux, ok. J’avoue que je n’ai pas réfléchi une seconde au design de SORM. Je me dis qu’on s’adaptera au fur et à mesure. Ici je teste qu’une méthode .find_by_whatever renvoie un tableau, c’est tout. C’est histoire de se mettre en marche. Lancement du test:

$ rspec sorm_spec.rb 
sorm_spec.rb:3:in `<top (required)>': uninitialized constant SORM (NameError)

Et c’est partie pour l’écriture de notre classe SORM:

sorm.rb
1
2
3
class SORM

end

Je relance le test:

$ rspec sorm_spec.rb 
F

Failures:

  1) SORM.find_by_* returns an array
     Failure/Error: article = Article.find_by_whatever('foobar')
     NoMethodError:
       undefined method `find_by_whatever' for Article:Class
     # ./sorm_spec.rb:10:in `block (3 levels) in <top (required)>'

Finished in 0.0009 seconds
1 example, 1 failure

Failed examples:

rspec ./sorm_spec.rb:9 # SORM.find_by_* returns an array

La méthode find_by_whatever est bien sûr inconnue. Comme je veux gérer les méthodes find_by_* avec method_missing j’écris:

sorm.rb
1
2
3
4
5
6
7
class SORM

  def self.method_missing(method, *args)
    []
  end

end

Et maintenant on est sur la voie:

$ rspec sorm_spec.rb 
.

Finished in 0.01664 seconds
1 example, 0 failures

On a pas avancé beaucoup, mais on a quand même mis en place le TDD et notre classe SORM.

To be continued

À demain.

Articles connexes

Commentaires