2016-07-16 16 views
1

Ich möchte meine Methode testen, die eine CSV-Datei importieren. Aber ich weiß nicht, wie man gefälschte CSV-Dateien erzeugt, um es zu testen. Ich habe viele Lösungen ausprobiert, die ich bereits im Stack gefunden habe, aber in meinem Fall funktioniert das nicht. HierErzeuge gefälschte CSV zum Testen mit rspec

ist die csv Originaldatei:

firstname,lastname,home_phone_number,mobile_phone_number,email,address 
orsay,dup,0154862548,0658965848,[email protected],2 rue du pré paris 
richard,planc,0145878596,0625147895,[email protected],45 avenue du general leclerc 

person.rb

def self.import_data(file) 
    filename = File.join Rails.root, file 

    CSV.foreach(filename, headers: true, col_sep: ',') do |row| 
    firstname, lastname, home_phone_number, mobile_phone_number, email, address = row 

    person = Person.find_or_create_by(firstname: row["firstname"], lastname: row['lastname'], address: row['address']) 
    if person.is_former_email?(row['email']) != true 
     person.update_attributes({firstname: row['firstname'], lastname: row['lastname'], home_phone_number: row['home_phone_number'], mobile_phone_number: row['mobile_phone_number'], address: row['address'], email: row['email']}) 
    end 
    end 
end 

person_spec.rb:

require "rails_helper" 

RSpec.describe Person, :type => :model do 


    describe "CSV file is valid" do 
    file = #fake file 
    it "should read in the csv" do 
    end 

    it "should have result" do 
    end 
end 

describe "import valid data" do 
    valid_data_file = #fake file 
    it "save new people" do 
    Person.delete_all 
    expect { Person.import_data(valid_data_file)}.to change{ Person.count }.by(2) 
    expect(Person.find_by(lastname: 'dup').email).to eq "[email protected]" 
end 

it "update with new email" do 
end 
end 

describe "import invalid data" do 
invalid_data_file = #fake file 
it "should not update with former email" do 
end 
it "should not import twice from CSV" do 
end 
end 
end 

Antwort

-1

Verwendung von Openoffice oder Excel und die Datei aus als speichern .csv-Datei in den Speicheroptionen. Ein Tabellenkalkulationsprogramm.

+0

Ja, ich denke schon darüber nach, aber ich dachte, es gäbe einen effizienteren Weg. – Orsay

0

Ich habe die Faked CSV Gem von https://github.com/jiananlu/faked_csv erfolgreich verwendet, um Ihren Zweck der Generierung einer CSV-Datei mit gefälschten Daten zu erreichen.

Gehen Sie folgendermaßen vor, es zu benutzen:

  1. Öffnen Sie die Befehlszeile (das heißt auf OSX offen Spotlight mit CMD + Raum, und geben Sie "Terminal")
  2. CSV Gem Faked installieren gem install faked_csv Befehl ausgeführt wird. Hinweis: Wenn ein Ruby on Rails-Projekt hinzufügen gem 'faked_csv' zu Ihrem Gemfile verwenden, und führen Sie dann bundle install
  3. Validate Faked CSV Gem erfolgreich installiert werden, indem in Bash Eingabe-Terminal faked_csv --version
  4. eine Konfigurationsdatei für die Faked CSV Gem und wo Sie definieren wie man gefälschte Daten erzeugt. Im folgenden Beispiel wird eine CSV-Datei mit 200 Zeilen erstellt (oder so viele, wie Sie möchten), und sie enthält durch Kommas getrennte Spalten für jedes Feld. Wenn der Wert des Feldes type das Präfix faker: hat, dann beziehen Sie sich auf Beispiele für den Abschnitt "Verwendung" der Faker Gemhttps://github.com/stympy/faker.

my_faked_config.csv.json

{ 
    "rows": 200, 
    "fields": [ 
    { 
     "name": "firstname", 
     "type": "faker:name:first_name", 
     "inject": ["luke", "dup", "planc"] 
    }, 
    { 
     "name": "lastname", 
     "type": "faker:name:last_name", 
     "inject": ["schoen", "orsay", "richard"] 
    }, 
    { 
     "name": "home_phone_number", 
     "type": "rand:int", 
     "range": [1000000000, 9999999999] 
    }, 
    { 
     "name": "mobile_phone_number", 
     "type": "rand:int", 
     "range": [1000000000, 9999999999] 
    }, 
    { 
     "name": "email", 
     "type": "faker:internet:email" 
    }, 
    { 
     "name": "address", 
     "type": "faker:address:street_address", 
     "rotate": 200 
    } 
    ] 
} 
  1. Führen Sie den folgenden Befehl, um die Konfigurationsdatei my_faked_config.csv.json zu verwenden, um eine CSV-Datei in das erzeugen aktueller Ordner mit dem Namen my_faked_data.csv, der die falschen Daten enthält faked_csv -i my_faked_config.csv.json -o my_faked_data.csv
  2. Da die generierte Datei möglicherweise nicht das zugehörige Label für jede Spalte nach der Generierung enthält, fügen Sie einfach manuell die folgende Zeile an der Spitze der my_faked_data.csvfirstname,lastname,home_phone_number,mobile_phone_number,email,address
  3. Überprüfen Sie die endgültige Inhalt des my_faked_data.csv CSV-Datei die gefälschten Daten enthält, die ähnlich der folgenden erscheinen:

my_faked_data.csv

firstname,lastname,home_phone_number,mobile_phone_number,email,address 
Kyler,Eichmann,8120675609,7804878030,norene[email protected],56006 Fadel Mission 
Hanna,Barton,9424088332,8720530995,[email protected],874 Leannon Ways 
Mortimer,Stokes,5645028548,9662617821,[email protected],566 Wilderman Falls 
Camden,Langworth,2622619338,1951547890,[email protected],823 Esmeralda Pike 
Nikolas,Hessel,5476149226,1051193757,[email protected],276 Reinger Parks 
... 
  1. Ändern Sie bitte Ihre person_spec.rb Unit-Test unter Verwendung der Technik unten gezeigt, die in Mock Daten passiert Funktionalität der import_data Funktion Ihres Person zu testen. rb Datei

person_spec.rb

require 'rails_helper' 

RSpec.describe Person, type: :model do 

    describe 'Class' do 
    subject { Person } 

    it { should respond_to(:import_data) } 

    let(:data) { "firstname,lastname,home_phone_number,mobile_phone_number,email,address\r1,Kyler,Eichmann,8120675609,7804878030,[email protected],56006 Fadel Mission" } 

    describe "#import_data" do 
     it "save new people" do 
     File.stub(:open).with("filename", {:universal_newline=>false, :headers=>true}) { 
      StringIO.new(data) 
     } 
     Product.import("filename") 
     expect(Product.find_by(firstname: 'Kyler').mobile_phone_number).to eq 7804878030 
     end 
    end 
    end 

end 

Hinweis: Ich habe es selbst verwendet, um eine große CSV-Datei mit aussagekräftigen gefälschten Daten für meine Ruby on Rails CSV app zu generieren. Meine App ermöglicht es einem Benutzer, eine CSV-Datei mit bestimmten Spaltennamen hochzuladen und in einer PostgreSQL-Datenbank zu speichern. Anschließend werden die Daten in einer paginierten Tabellenansicht mit der Möglichkeit zum Suchen und Sortieren mit AJAX angezeigt.