5

Questo idioma Iconv transcodifica una stringa UTF-8 e scende caratteri che non possono essere traslitterato:Come scriveresti un test per l'idioma `Iconv.new (" UTF8 // IGNORE ", ...)`?

require "iconv" 

def normalize(text) 
    Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv(text.dup) 
end 

Come sarebbe effettivamente scrivere un test per questo?

Modifica: ho finito per semplificare la domanda da quando ho capito che il contesto di provare a testare questo in un file spec Rails # encoding: utf-8 stava complicando il problema. Quindi ora la taglia è piuttosto stupida, ma la ricompenserò comunque se qualcuno può mostrare un test su cui posso lavorare.

+0

Forse, guardare a questo: http://robots.thoughtbot.com/post/42664369166/fight-back-utf-8-invalid-byte-sequences – Hock

risposta

3

È possibile costruire stringhe da un array di byte utilizzando il metodo #pack. In questo modo, puoi facilmente generare una stringa non valida/errata e usarla in un test.

Esempio:

describe "#normalize" do 
    it "should remove/ignore invalid characters" do 
    # this "string" equals "Mandados de busca do caso Megaupload considerados inv\xE1lidos - Tecnologia - Sol" 
    bad_string = [77, 97, 110, 100, 97, 100, 111, 115, 32, 100, 101, 32, 98, 117, 115, 99, 97, 32, 100, 111, 32, 99, 97, 115, 111, 32, 77, 101, 103, 97, 117, 112, 108, 111, 97, 100, 32, 99, 111, 110, 115, 105, 100, 101, 114, 97, 100, 111, 115, 32, 105, 110, 118, 225, 108, 105, 100, 111, 115, 32, 45, 32, 84, 101, 99, 110, 111, 108, 111, 103, 105, 97, 32, 45, 32, 83, 111, 108].pack('c*').force_encoding('UTF-8') 

    normalize(bad_string).should == 'Mandados de busca do caso Megaupload considerados invlidos - Tecnologia - Sol' 
    end 
end 

(mi dispiace per la stringa di prova piuttosto lungo, non riuscivo a trovare un esempio più breve nel mio codice)

+0

Puoi spiegare lo scopo di 'force_encoding' nel tuo test? Emulerebbe il processo di passare una stringa attraverso un modulo 'accept-charset = utf8' o qualcosa del genere? – danneu

+0

Sì, esattamente. La cosa che vuoi ottenere con il tuo metodo 'normalize' è convertire stringhe utf8 non valide in stringhe valide. Quindi per testare il tuo metodo, devi prima creare una stringa utf8 non valida. E il metodo sopra è il modo più semplice che ho trovato per ottenerlo: usare 'pack' per creare una stringa da una collezione di byte e poi' force_encoding' per contrassegnare questa stringa come utf8 ... – severin

1

testare questo in rotaie, anche con un set #encoding è possibile.

basta usare una codifica-passo come URL-fughe:

require "iconv" 
require "cgi" 

def normalize(text) 
    Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv(text) 
end 

puts normalize(CGI.unescape("m%FCstring")) # => mstring 

modo con che si potrebbe scrivere un'asserzione.

quando si utilizza Ruby 1.9 Iconv è obsoleto e si dovrebbero usare i metodi di stringa encode!

+0

Sì, questa domanda è nata perché sto cercando di sostituire Iconv con 'String # encode' per Ruby 2.0.0 compatibilità e sto cercando di difendermi dalle regressioni. – danneu

+0

quindi la risposta non corrisponde alla tua domanda? o perché non lo fai eccetto? – phoet