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.
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? –
Aber es ist da, @ Peter-Alfvin! Hast du den Beitrag nicht gelesen? Der Code ist da! Lesen Sie die Methoden bitte noch einmal! –
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. –