2016-04-17 6 views
0

Ich habe ein Modul namens FileSystem in meiner App, die grundlegenden Dateisystem-Funktionalität ausführt. Hier ist der relevante Code davon.Ruby: Ausnahme falsch beim Testen der Erstellung eines Verzeichnisses

module TxtDB 
    module FileSystem 

    def self.create_database(db) 
     fpdb = db_full_path(db) 
     Dir.mkdir(fpdb) unless ((not valid_parameter?(db)) or (not valid_database?(fpdb))) 
    end 

    private 

    def self.valid_parameter?(db) 
     raise TxtDB::NIL_PARAMETER_ERROR unless (not db == nil) 
     raise TxtDB::NOT_A_STRING_ERROR unless (db.is_a? String) 
     raise TxtDB::EMPTY_PARAMETER_ERROR unless (not db.empty?) 
     true 
    end 

    def self.valid_database?(db) 
     raise TxtDB::DATABASE_ALREADY_EXISTS_ERROR unless (not Dir.exist?(db_full_path(db))) 
     true 
    end 

    def self.db_full_path(db) 
     "#{TxtDB::BASE_DIRECTORY}/#{db}" 
    end 

    end 
end 

Und das ist mein Rspec Test für diese Funktion

it 'raises a StandardError (Database already exists) if it receives the name of an existing database' do 
    base_path = TxtDB::BASE_DIRECTORY 
    if (not Dir.exist?(base_path)) then 
    Dir.mkdir(base_path) 
    end 
    db_path = File.join(TxtDB::BASE_DIRECTORY,'testedb') 
    if (not Dir.exist?(db_path)) then 
    Dir.mkdir(db_path) 
    end 
    expect { 
    TxtDB::FileSystem::create_database('testedb') 
    }.to raise_error(StandardError, TxtDB::DATABASE_ALREADY_EXISTS_ERROR) 
end 

kommt es vor, dass, wenn ich meine Tests laufen habe ich diesen Fehler

expected StandardError with "Database already exists", got #<Errno::EEXIST: File exists @ dir_s_mkdir - txtdb/testedb> 

Wie ich die Dinge sehe, sollte dies nicht passieren, da ich für die Existenz vor dem Aufruf testen Dir.mkdir. Aber da liege ich offensichtlich falsch, da der Fehler auftritt. Die Frage ist: Wo liege ich falsch?

==========

Nach dem Vorschlag von Peter Alfvin (siehe unten beantworten), ich meine Methode ändern

def self.create_database(db) 
    fpdb = db_full_path(db) 
    if (valid_parameter?(db) and valid_database?(fpdb)) then 
    Dir.mkdir(fpdb) 
    end 
end 

Jetzt gibt es keinen Zweifel das ist Validierungen werden vorher durchgeführt. Aber ich bekomme immer noch den gleichen Fehler.

Antwort

1

Dir.exists?(path) gibt true zurück, wenn Pfad ein Verzeichnis ist, andernfalls false. In valid_database? übergeben Sie es den vollständigen Pfadnamen, der auf eine Nicht-Verzeichnisdatei verweist.

Siehe http://ruby-doc.org/core-2.1.2/Dir.html#method-c-exists-3F

+0

Aber das ist der Punkt: valid_database? löst einen Standardfehler aus, wenn die Datenbank existiert. Dies wird vor dem Dir.mkdir überprüft, nicht nach. Dieser Fehler sollte vor dem Fehler in Dir.mkdir erhöht werden, meinst du nicht? –

+0

Aber es ist da, @ Peter-Alfvin! Hast du den Beitrag nicht gelesen? Der Code ist da! Lesen Sie die Methoden bitte noch einmal! –

+0

Der einzige Punkt in der Methode valid_database? ist das es testet ob es schon ein Verzeichnis mit dem Namen passe gibt. Wenn dies der Fall ist, ist es nicht möglich, die Datenbank zu erstellen, da sie bereits existiert. –

Verwandte Themen