[RUBY] Die Geschichte der Initialisierung von Money :: Currency während des Testens

Ich denke, es gibt viele Produkte, die Geld mit [RubyMoney] verwalten (https://github.com/RubyMoney/money). RubyMoney bietet standardmäßig eine Währungseinstellung. Sie können diese Einstellung jedoch überschreiben, wenn Sie dies wünschen. Auf vielen Systemen werden Sie die Einstellungen nach dem Festlegen der Einstellungen beim Erstellen der App wahrscheinlich nicht mehr nachträglich ändern. Im Rahmen von Tests möchten Sie die Einstellungen jedoch initialisieren, sobald Sie sie geändert haben. Gibt es nicht

In diesem Artikel werde ich erklären, wie die Währungseinstellung von RubyMoney in einem solchen Fall initialisiert wird.

Stellen Sie als Voraussetzung die Währung wie folgt ein.

cad = Money::Currency.find(:cad)

cad.name # => Canadian Dollar

Money::Currency.register(
  :priority            => cad.priority,
  :iso_code            => cad.iso_code,
  :name                => 'Something Different',
  :subunit             => cad.subunit,
  :subunit_to_unit     => cad.subunit_to_unit,
  :thousands_separator => cad.thousands_separator,
  :decimal_mark        => cad.decimal_mark
)

cad = Money::Currency.find(:cad)
cad.name # => Something Different

Die Klasse "Money :: Currency" verwaltet die Währungseinstellungen mit einer Instanzvariablen namens "@ table". Daher wäre es schön, wenn diese Instanzvariable zurückgesetzt werden könnte. Aufgrund der Spezifikationen können Sie jedoch nicht direkt auf "@ table" zugreifen. Initialisieren Sie es daher wie folgt.

 Money::Currency.instance_variable_set('@table', nil)
 Money::Currency.table # => reloading the initial setting

Es ist einfach. Selbst nach Durchführung der obigen Initialisierung erhalte ich den überschriebenen Wert.

cad = Money::Currency.find(:cad)
cad.name # => Something Different
Money::Currency.instance_variable_set('@table', nil)
Money::Currency.table
cad = Money::Currency.find(:cad)
cad.name # => Something Different.Nicht initialisiert!

Folgen Sie der Implementierung der Bibliothek im Detail, um die Antwort zu finden. Nach der Änderung müssen die Einstellungen nach dem Start der Anwendung konsistent sein, dh vom Beginn des Ruby-Prozesses bis zum Ende dieses Prozesses. Um diese Spezifikation zu implementieren, verwaltet Money :: Currency auch die Instanz selbst als Klassenvariable. Auf diese Weise müssen wir uns als Bibliotheksbenutzer nicht um die in der Entwicklung befindlichen Einstellungen kümmern. In diesem Sinne ist der verbesserte Code unten.

cad.name # => Something Different
Money::Currency.class_variable_set('@@instances', {})
Money::Currency.instance_variable_set('@table', nil)
Money::Currency.table
cad = Money::Currency.find(:cad)
cad.name # => Canadian Dollar

Es wurde erfolgreich initialisiert. Wenn Sie diesen Code in spec_helper usw. schreiben, können Sie den Test garantieren, der nicht von der Überschreibung der Einstellung von "Money :: Currency" abhängt.

Das Schreiben dieser Einstellung ist jedoch mühsam. Tatsächlich bietet der neueste RubyMoney :: Money-Master eine API Money :: Currency.reset!, Um diese Initialisierung durchzuführen. Dies ist die Pull-Anforderung für diese Änderung. Wenn Sie diese Funktion verwenden möchten, installieren Sie bitte den neuesten Master. Wir hoffen, dass die nächste aktualisierte Version von "RubyMoney :: Money" bald veröffentlicht wird.

Die englische Version ist hier

Recommended Posts

Die Geschichte der Initialisierung von Money :: Currency während des Testens
[Java Edition] Geschichte der Serialisierung
Die Geschichte von @ViewScoped, die Speicher verschlingt
Die Geschichte der Begegnung mit Spring Custom Annotation
Was ist ein Test? ・ Über die Wichtigkeit eines Tests
Die Geschichte der Aktualisierung des Docker-Containers von Sonar Qube
Die Geschichte von RxJava, das unter NoSuchElementException leidet
Die Geschichte des Schreibens von Java in Emacs
Eine Geschichte, die die Implementierung der SendGrid-Java-Bibliothek bestätigt, wenn die E-Mail-Zustellung fehlschlägt
Die Geschichte des einfachen String-Vergleichs in Java
Die Geschichte eines gewöhnlichen Othello in Java
Die Geschichte des Lernens von Java in der ersten Programmierung
Die Geschichte der Einführung der Ajax-Kommunikation in Ruby
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Die Geschichte der Optimierung der Android-App mit libGDX
Die Geschichte des Hinzufügens der neuesten Node.js zu DockerFile
Wenn der Schwebeflug von Eclipse schwer zu sehen ist
Die Geschichte, einen Reverse-Proxy mit ProxyServlet zu erstellen
Die Geschichte einer illegalen staatlichen Ausnahme in Jetty.
Wenn der Monat des Datums erfasst wird, verschiebt sich der Januar
[Java] Beim Schreiben der Quelle ... Memorandum ①
Die Geschichte, Dr. Orchid mit LINE BOT zu machen
Die Geschichte von dto, dao-like mit Java, SQLite