Rails2.3.5 do 3.0 migracja testów -`test': wrong number of arguments (

Witam,

Migruję aplikację z 2.3.5 na 3.0 i o ile sama apka poszła gładko to testów za nic nie mogę przeskoczyć.

Chciałem przenieść 1 test jednostkowy, więc przeniosłem plik z testem oraz fixturesa - niestety kiedy odpalam rake test:units, dostaję takie cudo (tu juz z --trace):

** Invoke test:units (first_time) ** Invoke test:prepare (first_time) ** Invoke db:test:prepare (first_time) ** Invoke db:abort_if_pending_migrations (first_time) ** Invoke environment (first_time) ** Execute environment ** Execute db:abort_if_pending_migrations ** Execute db:test:prepare ** Invoke db:test:load (first_time) ** Invoke db:test:purge (first_time) ** Invoke environment ** Execute db:test:purge ** Execute db:test:load ** Invoke db:schema:load (first_time) ** Invoke environment ** Execute db:schema:load ** Execute test:prepare ** Execute test:units test/unit/changelog_test.rb:12:in `test': wrong number of arguments (1 for 2) (ArgumentError) from test/unit/changelog_test.rb:12:in `<class:ChangelogTest>' from test/unit/changelog_test.rb:4:in `<top (required)>' from /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `load' from /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `block in <main>' from /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `each' from /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `<main>' rake aborted! Command failed with status (1): [/home/mencio/.rvm/rubies/ruby-1.9.2-p0/bin...] /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:995:in `block in sh' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:1010:in `call' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:1010:in `sh' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:1094:in `sh' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:1029:in `ruby' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:1094:in `ruby' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0/lib/rails/test_unit/testing.rake:26:in `block (2 levels) in define' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:1112:in `verbose' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0/lib/rails/test_unit/testing.rake:11:in `block in define' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:636:in `call' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:636:in `block in execute' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:631:in `each' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:631:in `execute' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:597:in `block in invoke_with_call_chain' /home/mencio/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:583:in `invoke' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:2029:in `block (2 levels) in top_level' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:2029:in `each' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:2029:in `block in top_level' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:2001:in `block in run' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake.rb:1998:in `run' /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/bin/rake:31:in `<top (required)>' /home/mencio/.rvm/gems/ruby-1.9.2-p0/bin/rake:19:in `load' /home/mencio/.rvm/gems/ruby-1.9.2-p0/bin/rake:19:in `<main>'
Sam testfile wygląda następująco:

[code]# coding: utf-8
require ‘test_helper’

class ChangelogTest < ActiveSupport::TestCase
fixtures :changelogs

def setup
@valid_log = changelogs(:valid)
@invalid_log = changelogs(:invalid)
end

test “log validity” do
@valid_log.valid?
end

end[/code]
Jak widać, test jest w zasadzie “żaden” a mimo to się wywala …

Dodam tylko że jeśli test ma taką postać:

def test_log_validity @valid_log.valid? end
To wykonuje się bez problemu…

to może zastosuj metodę “z dawnych czasów” i zrób:

def test_log_validity @valid_log.valid? end

[quote=Arsen7]to może zastosuj metodę “z dawnych czasów” i zrób:

def test_log_validity @valid_log.valid? end
[/quote]
Tak działa, przecież pisałem. Jednak nie bardzo widzi mi się zmiana 1000 testów …

Aaa jakby ktoś chciał wiedzieć to ruby -v:
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]

Gemlist:
abstract (1.0.0)
actionmailer (3.0.0)
actionpack (3.0.0)
activemodel (3.0.0)
activerecord (3.0.0)
activeresource (3.0.0)
activesupport (3.0.0)
arel (1.0.1)
builder (2.1.2)
bundler (1.0.0)
daemons (1.0.10)
erubis (2.6.6)
gem_plugin (0.2.3)
i18n (0.4.1)
mail (2.2.5)
mime-types (1.16)
mongrel (1.2.0.pre2)
mysql (2.8.1)
polyglot (0.3.1)
rack (1.2.1)
rack-mount (0.6.13)
rack-test (0.5.4)
rails (3.0.0)
railties (3.0.0)
rake (0.8.7)
rdoc (2.5.11)
ruby-mysql (2.9.3)
sqlite3-ruby (1.3.1)
thor (0.14.0)
treetop (1.4.8)
tzinfo (0.3.23)
will_paginate (3.0.pre2)

Zrób grepa na definicję metody “test” w klasie ActiveSupport::TestCase i może coś tam będzie ciekawego?

(Pisałeś, ale ja zacząłem pisać wcześniej :wink: )

Nie rozumiem :wink: - moglbyś przykładem ;)?

Kolejna ciekawostka:
0 tests, 0 assertions, 0 failures, 0 errors, 0 skips

Jesłi odpale tak:

test "log validity", "byleco" do @valid_log.valid? end

Spróbuj zajrzeć w kod Railsów. Nie mam ich pod ręką, więc nie bardzo mogę Ci podać konkretne ścieżki, ale poszukaj pliku definiującego klasę ActiveSupport::TestCase i zobacz czy jest tam gdzieś zdefiniowana metoda “test”.
Może komentarz lub sama nazwa parametru będzie jakąś wskazówką.

W razie czego możesz pewnie zdefiniować w swoim teście metodę test z jednym parametrem i w niej wywoływać ‘super()’ z dwoma.

[quote=Arsen7]Spróbuj zajrzeć w kod Railsów. Nie mam ich pod ręką, więc nie bardzo mogę Ci podać konkretne ścieżki, ale poszukaj pliku definiującego klasę ActiveSupport::TestCase i zobacz czy jest tam gdzieś zdefiniowana metoda “test”.
Może komentarz lub sama nazwa parametru będzie jakąś wskazówką.

W razie czego możesz pewnie zdefiniować w swoim teście metodę test z jednym parametrem i w niej wywoływać ‘super()’ z dwoma.[/quote]
Juz sie biore za grzebanie - tylko ze jesli wywołuje z dwoma to test sie nie wykonuje …

http://api.rubyonrails.org/classes/ActiveSupport/TestCase.html - może tam coś znajdziesz.

Co za ba… - bez JavaScriptu już się nie można dostać do [show source]. Bleh… :frowning:

[quote=Arsen7]http://api.rubyonrails.org/classes/ActiveSupport/TestCase.html - może tam coś znajdziesz.

Co za ba… - bez JavaScriptu już się nie można dostać do [show source]. Bleh… :-([/quote]
Przeszedłem zarówno przez to jak i przez rzeczy które wskazuje netbeans. Niestety nie ma tam nic sensownego :confused:

Znalazlem:

def test(name, &block) puts name test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym defined = instance_method(test_name) rescue false raise "#{test_name} is already defined in #{self}" if defined if block_given? define_method(test_name, &block) else define_method(test_name) do flunk "No implementation provided for #{name}" end end end
Jednak nawet jak przerabiam to nie dziala. Wyglada na to ze Railsy nie widzą z jakiegos powodu ze wstawiam blok kodu. Zmienilem wersje rubiego na 1.9.2-rc1 ale dalej to samo.

A zobacz co masz w ./activesupport/lib/active_support/testing/declarative.rb – ja tam widzę normalne “def test(name, &block)”

Masz jakąś dziwną wersję, czy może netbeans sprawia problemy?

Ok, znowu zacząłem pisać wcześniej :wink:

Bez netbeans działa?

[quote=Arsen7]Ok, znowy zacząłem pisać wcześniej :wink:

Bez netbeans działa?[/quote]
Netbeans 6.8 nie mają wsparcia dla Rails3.0 więc wszystko odpalam z konsoli (w NB tylko kodzę)

Ok, robi się bałagan jak się edytuje posty w czasie zażartej dyskusji :slight_smile:

Czy jak zrobisz nowy projekt, to w nim testy działają prawidłowo? Może to jakiś problem konfiguracji? A może masz gdzieś test_helper, który coś psuje?

Na nowym projekcie działa prawidłowo … co do test_helpera to mam jeden ten oryginalny

Aplikacje migrowałem w ten sposob, że po prostu stworzyłem nowy projekt, przeniosłem kontrolery, modele i całą reszte, zaś configi zostawiłem oryginalne (nowe)

Ja też stawiam na test_helper. Generowałeś szkielet do testów w railsach 3 i przerzuciłeś testy z 2.3.5, czy przerzuciłeś cały katalog test?

Stworzyłem nowy projekt, po czym przeniosłem katalog app z projektu na v2 do v3. Testów w ogóle nie przenosiłem.

Przeniosłem ten jeden plik (changelog_test).

Plik test_helper już był. Dla pewności utworze nowy projekt raz jeszcze i przeniosę tam kod aplikacji

Ok znalazlem ale nie rozumiem:

jesli mam dodany w modelach, model Spec::Base - to wali ten błąd, jesli usune z modeli ten plik, to błędu nie ma.

Oto kod :slight_smile:

[code]class Spec::Base < ActiveRecord::Base

end[/code]
Ok, nie bylo tego stwierdzenia :stuck_out_tongue: wiem co zaraz powiecie i nie musicie :wink: hehe

http://github.com/rails/rails_upgrade

Ja korzystałem z tego i problemów z testami nie miałem. Nadpisało mi chyba test_helper. Aczkolwiek pewien nie jestem :stuck_out_tongue:
Z tym, że korzystałem z shouldy i test::unit.

Spoko :wink: problem rozwiązałem - nie ma to jak pogryzc namespacy :wink: Spec:: jest zajęte (na uspr. powiem, że ten model mam już od daaaaawna :wink: )

To zeby nie zamulać nowym wątkiem:

require File.dirname(FILE) + “/base_helper_test.rb”

Dawniej sobie tak includowałem helpery bazowe w których miałem metody dla kazdego pliku z modułu.

Teraz dostaje:

test/unit/helpers/sorting_helper_test.rb:1:in require': no such file to load -- test/unit/helpers/base_helper_test.rb (LoadError) from test/unit/helpers/sorting_helper_test.rb:1:in<top (required)>’
from /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in load' from /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:inblock in ’
from /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in each' from /home/mencio/.rvm/gems/ruby-1.9.2-p0/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in

i nic :frowning: