PierreGambarotto / sinatra-skeleton

Squellete pour un projet sinatra, authentification par omniauth
1 stars 0 forks source link

Probleme ActiveRecord.save #13

Closed Sleashe closed 11 years ago

Sleashe commented 11 years ago

J'ai un petit soucis... J'envoie un json formaté via rspec à mon application. Mon application analyse ce json et crée un certains nombre d'objets en base. En revanche, le premier est bien crée, le second....jamais!

Voilà mon code de l'application :

#For each film to add
  finalValue.each{|film|

    #If values are not right
    halt 400 unless params_valid?(film)

    #Check if the film doesn't already exists in db
    halt 400 unless !Film.exists?(:imdb_url => film['imdb_url'])

    Users = Person.find_by_username(film['users'][0])

    puts film

    film_to_add = Film.new do |f|

    f.title = film['title']
    f.year = film['year']
    f.directors = film['directors']
    f.imdb_url = film['imdb_url']
    f.actors = film['actors']
    f.people.push(Users)
    f.save
    end
  }

Et voilà le code de mon test :

context "when sending more than one film" do
      before (:each) do
         #right json generation
        @value = [{:title => "MyFilm", :year => '2010', :directors => ["John MacLesgy"], :actors => ["John MacLesgy Junior"], :imdb_url => 'http://www.imdb.com/title/tt0095016/', :users => ["Tristan"]},
              {:title => "MyFilm2", :year => '2011', :directors => ["John MacLesgy2"], :actors => ["John MacLesgy Junior2"], :imdb_url => 'http://www.imdb.com/title/tt0095017/', :users => ["Tristan"]}]
        @json_value = @value.to_json

        #Adding person
        t = Person.new
        t.username = 'Tristan'
        t.password = 'Password'
        t.save
      end
      it 'should push two entries into our database' do
        post '/film', {:value => @json_value}, {'HTTP_ACCEPT' => 'application/json'}

        MyFilm = Film.find_by_imdb_url(@value[0][:imdb_url])
        MyFilm.should_not be_nil
        MyFilm2 = Film.find_by_imdb_url(@value[1][:imdb_url])
        MyFilm2.should_not be_nil
      end
    end

Alors le premier should passe sans problème, mais le deuxième me dit toujours :

excpected: not_nil
got: nil
PierreGambarotto commented 11 years ago

envoie moi une archive du code pour que j'en dise plus, pas assez de détails là.

Sleashe commented 11 years ago

toute est dispo là : https://bitbucket.org/Sleashe/imdbproject/

PierreGambarotto commented 11 years ago

A priori c'est un problème dans tes modèles. Au niveau validation déjà : la validation d'une personne implique la validation des films associées qui implique la validation de la personne, etc. Tu as un cycle, ce n'est pas bon.

Dans la classe Person.rb, il te faut mettre has_and_belongs_many films (avec un s à la fin). Et du coup cela passe mieux.

Constat global : il faut vraiment que tu refactorises ton code une fois qu'un test tourne, c'est assez moche là :-( Et tu n'as pas testé tes modèles, ce qui fait que tu n'as pas détecté cette erreur. Voilà à quoi cela servent les tests en particulier.