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