[RUBY] L'histoire de l'initialisation de Money :: Currency pendant les tests

Je pense qu'il existe de nombreux produits qui gèrent l'argent en utilisant RubyMoney. RubyMoney fournit un paramètre de devise par défaut, mais vous pouvez remplacer ce paramètre si vous le souhaitez. Sur de nombreux systèmes, une fois que vous avez défini les paramètres lors de la création de l'application, vous ne les modifierez probablement pas par la suite, mais dans le contexte des tests, vous souhaitez initialiser les paramètres une fois que vous les avez modifiés. N'est-ce pas?

Dans cet article, je vais vous expliquer comment initialiser le paramètre de devise de RubyMoney dans un tel cas.

En principe, définissez la devise comme suit.

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

La classe Money :: Currency gère les paramètres de devise avec une variable d'instance appelée @ table. Par conséquent, ce serait bien si cette variable d'instance pouvait être réinitialisée. Cependant, en raison des spécifications, vous ne pouvez pas accéder directement à @ table, alors initialisez-le comme suit.

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

C'est facile. Cependant, même après avoir effectué l'initialisation ci-dessus, je reçois toujours la valeur écrasée.

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.Non initialisé!

Suivez l'implémentation de la bibliothèque en détail pour trouver la réponse. Une fois modifiés, les paramètres doivent être cohérents après le lancement de l'application, c'est-à-dire du début du processus Ruby à la fin de ce processus. Pour implémenter cette spécification, Money :: Currency gère également l'instance elle-même en tant que variable de classe. De cette façon, en tant qu'utilisateurs de bibliothèque, nous n'avons pas à nous soucier des paramètres en cours de développement. Dans cet esprit, le code amélioré est ci-dessous.

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

Il a été initialisé avec succès, et si vous écrivez ce code dans spec_helper etc., vous pouvez garantir le test qui ne dépend pas du remplacement de paramètre de Money :: Currency sous test.

Mais c'est compliqué d'écrire ce paramètre. En fait, le dernier maître RubyMoney :: Money fournit une API Money :: Currency.reset! Pour effectuer cette initialisation. Ceci est la demande d'extraction pour ce changement. Si vous souhaitez utiliser cette fonctionnalité, veuillez installer la dernière version du master. Nous espérons que la prochaine version mise à jour de RubyMoney :: Money sera bientôt disponible.

La version anglaise est ici

Recommended Posts

L'histoire de l'initialisation de Money :: Currency pendant les tests
[Édition Java] Histoire de la sérialisation
L'histoire de @ViewScoped dévore la mémoire
L'histoire de la rencontre avec l'annotation personnalisée Spring
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
L'histoire de la mise à jour du Docker Container de Sonar Qube
L'histoire de RxJava souffrant de NoSuchElementException
L'histoire de l'écriture de Java dans Emacs
Une histoire confirmant l'implémentation de la bibliothèque Java SendGrid lorsque la livraison du courrier échoue
L'histoire de la comparaison de chaînes de bas niveau en Java
L'histoire de la fabrication d'un Othello ordinaire à Java
L'histoire de l'apprentissage de Java dans la première programmation
L'histoire de l'introduction de la communication Ajax à Ruby
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
L'histoire du réglage de l'application Android avec libGDX
L'histoire de l'ajout du dernier Node.js à DockerFile
Quand le survol d'Eclipse est difficile à voir
L'histoire de la création d'un proxy inverse avec ProxyServlet
L'histoire d'une exception d'état illégale dans Jetty.
Lorsque le mois de la date est acquis, le quart de janvier
[Java] Lors de l'écriture du source ... Mémorandum ①
L'histoire de la création de Dr.Orchid avec LINE BOT
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite