[RUBY] Une histoire dans laquelle j'étais accro à la conversion de type implicite d'ActiveRecord lors du test unitaire

un événement

Le code de test unitaire suivant échoue.

item_spec.rb


    it 'Seuls les nombres demi-largeur peuvent être enregistrés' do
      @item.price = '1000'
      @item.valid?
      expect(@item.errors.full_messages).to include('Price Half-width characters.')
    end

Cause

Lors de l'affectation de la chaîne de caractères "1000" à l'élément de type entier "prix", Une conversion de type implicite a été effectuée et le prix a reçu le numéro "0".

↓ Vérifiez comment la conversion de type implicite est effectuée sur la console ↓

irb(main):002:0> @item.price = '1000'
=> "1000"
irb(main):003:0> @item.price
=> 0

Après avoir remplacé la chaîne de caractères "1000", la valeur du prix sera la valeur numérique "0".

Cela est dû à une fonctionnalité appelée «API Active Record Attributes» ajoutée dans Rails 5. La conversion de type implicite est une image dans laquelle le setter suivant se déplace dans les coulisses. Le point est to_i.

  #Setter
  def price=(price)
    @price = price.to_i
  end

Conclusion

Résolu en écrivant ce qui suit dans le modèle Item

item.rb


class Item < ApplicationRecord
  attr_accessor :price

[Explication] attr_accessor est une méthode qui peut réaliser le traitement setter / getter pour les éléments. La description suivante et "attr_accessor: price" ont la même signification.

  #Setter
  def price=(price)
    @price = price
  end

  #Getter
  def price
    @price
  end

Autrement dit, en appelant un pur setter (pas to_i) avec ceci Vous pourrez attribuer une chaîne qui n'est pas to_i à price.

irb(main):002:0> @item.price = '1000'
=> "1000"
irb(main):003:0> @item.price
=> "1000"

[Lien de référence]

Pour le mécanisme de l '"API Active Record Attributes", je me suis référé à l'article suivant. https://www.wantedly.com/companies/wantedly/post_articles/31132

Recommended Posts

Une histoire dans laquelle j'étais accro à la conversion de type implicite d'ActiveRecord lors du test unitaire
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
J'étais accro aux tests unitaires avec l'opérateur de tampon dans RxJava
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
Une histoire à laquelle j'étais accro avec toString () d'Interface qui était proxy avec JdkDynamicAopProxy
[Circle CI] Une histoire à laquelle j'étais accro chez Start Building
J'étais accro à un simple test de Jedis (bibliothèque Java-> Redis)
Une histoire accro à EntityNotFoundException de getOne de JpaRepository
J'étais accro à faire onActivityResult () avec DialogFragment
J'étais accro au record du modèle associé
J'étais accro à getXxxx de ResultSet car c'est un type primitif (Java)
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
Notez que j'étais accro au traitement par lots avec Spring Boot
Notez que j'étais accro aux paramètres du projet Android d'IntelliJ IDEA
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis
J'étais accro à la configuration de default_url_options avec l'introduction de la conception de Rails
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
clone de kintone? J'étais assez accro au lancement de l'extension OSS WebDB avec Lightsail + Docker, alors prenez-en note.
J'étais accro au réglage de laradock + VSCode + xdebug
Ce à quoi j'étais accro avec l'API REST Redmine
L'histoire à laquelle j'étais accro lors de la création de STS
Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
Une histoire sur la connexion à un serveur CentOS 8 avec un ancien Ansible
Une note quand j'étais accro à la conversion d'Ubuntu sur WSL1 en WSL2
Ce à quoi j'étais accro lors de la mise en œuvre de l'authentification Google avec des rails
J'étais accro au paramètre API version min23 de registerTorchCallback
J'étais accro au démarrage de sbt
L'histoire de rendre possible la construction d'un projet qui a été construit par Maven avec Ant
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream
Enregistré parce que j'étais accro à l'entrée standard de la classe Scanner
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
J'étais un peu accro à la connexion ssh de mac à linux (ubuntu)
Une histoire accro aux espaces réservés des modèles JDBC
Je veux écrire un test unitaire!
J'étais accro à la réécriture sur @ SpringApplicationConfiguration-> @SpringBootTest
J'étais accro à la méthode du rouleau
J'étais accro au test Spring-Batch
J'ai essayé d'implémenter une fonction équivalente à Felica Lite avec HCE-F d'Android
J'étais un peu accro à la comparaison S3 Checksum, alors prenez note.
Rails6 Je veux créer un tableau de valeurs avec une case à cocher
J'ai essayé de cloner une application Web pleine de bugs avec Spring Boot
Une histoire dans laquelle j'étais vraiment quand j'ai fait triple DES avec ruby
J'étais accro à l'utilisation de RXTX avec Sierra
J'ai essayé de casser le bloc avec java (1)
[Jackson] Une histoire sur la conversion de la valeur de retour du type BigDecimal avec un sérialiseur personnalisé.
La partie à laquelle j'étais accro dans "Introduction à Ajax dans les applications Web Java" de NetBeans
Java: Une histoire qui m'a mis mal à l'aise quand on m'a appris à comparer des chaînes avec des égaux sans raison.