2017-02-01 2 views
1

Fix & Original-Tests am BodenModellversuche mit Mini-Test

ich zwei Modellversuche habe die im Format identisch sind, aber nur einer funktioniert. Ich bin ganz neu beim Testen im Mini-Test oder im Allgemeinen. Ich habe auch die Problemliste für den Mini-Test & gelesen haben einfach nicht genug Fähigkeit oder Verständnis, um eine Lösung zu finden, die von den verschiedenen Ausgaben funktioniert.

Ziel: Eine Arbeits .valid? in meiner CampplayTest.rb Datei oder ein Verständnis, warum es & hat versagt, was ich verwenden sollte es Platz (wie devise der ist blowmage sagt .Gültig sollte anstelle von .save verwendet werden?)

EDIT: Anscheinend mein Modell es ist - nicht sicher, wie das ist ungültig -

Failing Test-Datei hier unter den ursprünglichen Fehler sehen ...

require 'test_helper' 

class CampplayTest < ActiveSupport::TestCase 

    # Test one missing from pair of ID 
    test 'invalid - no campaign' do 
    county = campplay.new(player_id: 1) 
    refute county.valid?, 'Campplay passed without a name' 
    end 

end 

Passing Testdatei hier ...

require "test_helper" 

class County_Test < ActiveSupport::TestCase 
    def setup 
    @county = County.create(name: "Example Item") 
    end 
test 'valid county' do 
    assert @county.valid?, 'county must have name' 
    end 

    # Test duplicate 
    test 'invalid - duplicate county' do 
    county = County.new(name: "Example Item") 
    refute county.valid?, 'county passed without a name' 
    end 

end 

Ich habe versucht ...

  1. die Geräte Clearing nur den Test läuft allein in rails c test
  2. mit 3 inherit Wege für test_helper.rb
  3. Wechsel zum Integrationstesthelfer in der Testdatei i tself
  4. mit dem Setup-Funktion
  5. Pluralisierung von Hand & durch das System mit ausspucken der Pluralisierung für Campplay
  6. Capitolizing
  7. mit .save! in rails c & rails c test
  8. ändern rails generate test_unit:model article title:string body:text Beispiel mein Modell & fileds zu rails generate test_unit:model Campplay campaign_id:integer player_id:integer
  9. Ändern der Testdateinamen & der Klassenname in der Testdatei zu Campplay_Test

Meine Fehlermeldung entsprechen ...

2.3.1 :006 >  c = Campplay.new(player_id: "1", campaign_id: "1")                         
=> #<Campplay id: nil, campaign_id: 1, player_id: 1, created_at: nil, updated_at: nil> 
2.3.1 :007 > c.valid? 
NoMethodError: undefined method `Campplay' for #<Campplay:0x00000004630890> 
Did you mean? campaign 
     from /usr/local/rvm/gems/ruby-2.3.1/gems/activemodel-5.0.0/lib/active_model/attribute_methods.rb:433:in `method_missing' 
     from /usr/local/rvm/gems/ruby-2.3.1/gems/activemodel-5.0.0/lib/active_model/validator.rb:149:in `block in validate' 
     from /usr/local/rvm/gems/ruby-2.3.1/gems/activemodel-5.0.0/lib/active_model/validator.rb:148:in `each' 
     from /usr/local/rvm/gems/ruby-2.3.1/gems/activemodel-5.0.0/lib/active_model/validator.rb:148:in `validate' 
(I truncated here to try & not spam people) 

test_helper.rb

ENV["RAILS_ENV"] = "test" 
require File.expand_path("../../config/environment", __FILE__) 
require "rails/test_help" 
require "minitest/rails" 

class ActiveSupport::TestCase 
    fixtures :all 
end 

class ActionController::TestCase 
    include Devise::Test::ControllerHelpers 
end 

Mein Campplay Modell ...

class Campplay < ApplicationRecord 
    belongs_to :campaign 
    belongs_to :player 

    validates :campaign_id, presence: true 
    validates :player_id, presence: true 

end 

Gem Liste --local mit "test"

guard-minitest (2.4.6) 
minitest (5.10.1, 5.8.3) 
minitest-capybara (0.8.2) 
minitest-color (0.0.2) 
minitest-metadata (0.6.0) 
minitest-rails (3.0.0) 
minitest-rails-capybara (3.0.0) 
rack-test (0.6.3) 
rails-dom-testing (2.0.2) 
test-unit (3.1.5) 

Full Guard-Datei ...

 bundle exec guard 
RubyDep: WARNING: Your Ruby is outdated/buggy. 
RubyDep: WARNING: Your Ruby is: 2.3.0 (buggy). Recommendation: upgrade to 2.3.1. 
RubyDep: WARNING: (To disable warnings, see:http://github.com/e2/ruby_dep/wiki/Disabling-warnings) 
12:46:03 - INFO - Guard::Minitest 2.4.6 is running, with Minitest::Unit 5.10.1! 
12:46:04 - INFO - Guard is now watching at '/home/ubuntu/workspace/basicB' 
12:46:07 - INFO - Running: test/models/campplay_test.rb 
RubyDep: WARNING: Your Ruby is outdated/buggy. 
RubyDep: WARNING: Your Ruby is: 2.3.0 (buggy). Recommendation: upgrade to 2.3.1. 
RubyDep: WARNING: (To disable warnings, see:http://github.com/e2/ruby_dep/wiki/Disabling-warnings) 
RubyDep: WARNING: Your Ruby is outdated/buggy. 
RubyDep: WARNING: Your Ruby is: 2.3.0 (buggy). Recommendation: upgrade to 2.3.1. 
RubyDep: WARNING: (To disable warnings, see:http://github.com/e2/ruby_dep/wiki/Disabling-warnings) 
Run options: --seed 24359 

# Running: 

E 

Error: 
CampplayTest#test_invalid_-_no_campaign: 
NameError: undefined local variable or method `campplay' for #<CampplayTest:0x00000003e05710> 
Did you mean? campplays 
    test/models/campplay_test.rb:14:in `block in <class:CampplayTest>' 


bin/rails test test/models/campplay_test.rb:13 

E 

Finished in 0.275098s, 3.6351 runs/s, 0.0000 assertions/s. 

1 runs, 0 assertions, 0 failures, 1 errors, 0 skips 

[1] guard(main)> 

Mein Schema für die Campplays ...

create_table "campplays", force: :cascade do |t| 
    t.integer "campaign_id" 
    t.integer "player_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.index ["campaign_id"], name: "index_campplays_on_campaign_id" 
    t.index ["player_id"], name: "index_campplays_on_player_id" 
    end 

Rails-Version - Situation wahrscheinlich festgelegt werden sollte - aber ich bin eine Checkliste jetzt & Wache nicht die Version der Annahme arbeiten, ist nur noch ein zwicken ...

mirv:~/workspace (master) $ cd basicB 
mirv:~/workspace/basicB (master) $ ruby -v 
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux] 
mirv:~/workspace/basicB (master) $ rvm install 2.3.1 
Already installed ruby-2.3.1. 
To reinstall use: 

    rvm reinstall ruby-2.3.1 

FIX

War einfach, es waren beschädigte Dateien ...

  1. Schienen zerstören Modell Campplay
  2. Schienen g Migration dropCampplay
  3. in der Migrationsdatei hat ein drop_table :campplays
  4. die rails g model Campplay campaign:references player:references
  5. Schienen db lauteten:
  6. Kopie & klebte mein früheres Modell Code migrieren ich
  7. Kopie & klebte Original speichern hatte Testcode, den ich gespeichert hatte

Kopie von der letzte Test-Datei ...

require 'test_helper' 

class CampplayTest < ActiveSupport::TestCase 

    test 'valid Campplay' do 
    cp = Campplay.new(player_id: "1", campaign_id: "1") 
    assert cp.valid?, 'Campplay must have player_id' 
    end 

    # Test one missing from pair of ID 
    test 'invalid - no campaign' do 
    cp = Campplay.new(player_id: 1) 
    refute cp.valid?, 'Campplay passed without a campaign_id' 
    end 

    test 'invalid - no player' do 
    cp = Campplay.new(campaign_id: 1) 
    refute cp.valid?, 'Campplay passed without a name' 
    end 

end 

ich das Update gutgeschrieben @gaston wie er Zeit darauf

+0

Leider ersetzt werden, aber es ist nicht klar, was Sie versuchen zu tun .Wo ist deine Testdatei? Ist dir bewusst, dass 'rails c' eine Konsole öffnet und keine Tests ausführt? – sixty4bit

+0

Hallo @ sixty4bit ... Ich dachte, das Mapping in der Konsole sollte das Problem deutlicher als die Testdatei zeigen. Ich möchte, dass '.valid?' Funktioniert. Außerdem ist der 'rails c test' etwas, das ich aus der Rails-Dokumentation herausgezogen habe, die den Test env für Sie in die rails-Konsole lädt, um Fehlermeldungen zu ziehen - was soviel heißt wie das Ausführen Ihrer Testdatei. Ich werde mehr über das Thema auf den neuesten Stand bringen. – Mirv

+0

können Sie Kampagnen- und Campplay-Klassen anzeigen ?, welcher Fehler "Test 'ungültig - keine Kampagne'" wirft? – Gaston

Antwort

0

1) ausgegeben sollten Sie ruby ​​aktualisieren

Your Ruby is: 2.3.0 (buggy). Recommendation: upgrade to 2.3.1.

2) war der Fehler eine Großzahl C:

class CampplayTest < ActiveSupport::TestCase 

    test 'invalid - no campaign' do 
    county = Campplay.new(player_id: 1)  #you should change county to campplay 
    refute county.valid?, 'Campplay passed without a name' 
    end 

end 

3) Jedoch gibt es einige Fehler im Test. Der Test wird passieren, aber aus einem anderen Grund, erfordert Campplay beide ID:

validates :campaign_id, presence: true 
validates :player_id, presence: true 

Gültig wegen der id scheitern, nicht wegen des Namens. Sie sollte hinzufügen:

validates :name, presence: true #optional ,length: { minimum: 1 } 

4) Ich würde empfehlen, shoulda-matches

Dabei wird der gesamte Test mit

class CampplayTest < ActiveSupport::TestCase 

    should validate_presence_of(:name) 
    should validate_presence_of(:player_id) 
    should validate_presence_of(:campaign_id) 
    should belong_to(:campaign) 
    should belong_to(:player) 
end 
+0

Ja, ich habe die campplay/Campplay-Sache so viele Male dort gemacht und entfernte Validierungen war der erste Schritt. Ich habe die Arbeitstests mehrmals kopiert und eingefügt und auch angepasst - deshalb habe ich nach dem 8. Mal angefangen, County als Var-Name zu verlassen, bis ich den Fehler in den Griff bekommen habe. Ich habe sowohl rvm als auch installiertes Ruby 2.3.1 aktualisiert - aus irgendeinem Grund ist es nicht mit Wache ... Ich habe die Ausgabe der Version am Ende der Seite hinzugefügt ... – Mirv

+0

hat mein Code funktioniert? – Gaston

+0

Sorry - sollte explizit nein gesagt haben - es hat nicht funktioniert. An dieser Stelle werde ich das Modell zerstören, die Tabelle löschen und neu starten - es muss irgendwo eine beschädigte Datei sein, da ich die einzige bin, die diese besondere Sache auch passiert (wenn es keine Vererbung von test_helper.rb ist) ... aber das hättest du schon erwähnt. Auf den shofaa matchers - ich sehe das und rspec - aber an diesem Punkt jongliere ich 3 Hauptsprachen auf 5 Frameworks und Rails alleine muss mich jeden zweiten Tag ein Juwel lernen lassen ... es wäre häufiger, aber keiner von ihnen ziemlich Arbeit für mich direkt out of the box ... – Mirv