[RUBY] Eine Geschichte, die mich während des Komponententests von der impliziten Typkonvertierung von ActiveRecord abhängig machte

Veranstaltung

Der folgende Unit-Test-Code schlägt fehl.

item_spec.rb


    it 'Es können nur Zahlen mit halber Breite gespeichert werden' do
      @item.price = '1000'
      @item.valid?
      expect(@item.errors.full_messages).to include('Price Half-width characters.')
    end

Ursache

Wenn Sie dem ganzzahligen Element "Preis" die Zeichenfolge "1000" zuweisen, Die implizite Typkonvertierung wurde durchgeführt und dem Preis wurde die Nummer "0" zugewiesen.

↓ Überprüfen Sie, wie die implizite Typkonvertierung auf der Konsole durchgeführt wird. ↓

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

Nach dem Ersetzen der Zeichenfolge "1000" ist der Preiswert der numerische Wert "0".

Dies ist auf eine Funktion namens "Active Record Attributes API" zurückzuführen, die in Rails 5 hinzugefügt wurde. Die implizite Typkonvertierung ist ein Bild, in dem sich der folgende Setter hinter die Kulissen bewegt. Der Punkt ist to_i.

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

Fazit

Gelöst durch Schreiben des Folgenden in das Artikelmodell

item.rb


class Item < ApplicationRecord
  attr_accessor :price

[Erläuterung] attr_accessor ist eine Methode, die die Setter / Getter-Verarbeitung für Elemente implementieren kann. Die folgende Beschreibung und "attr_accessor: price" haben dieselbe Bedeutung.

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

  #Getter
  def price
    @price
  end

Das heißt, indem Sie damit einen reinen Setter (nicht to_i) aufrufen Sie können dem Preis eine Zeichenfolge zuweisen, die nicht to_i ist.

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

[Referenzlink]

Für den Mechanismus der "Active Record Attributes API" habe ich auf den folgenden Artikel verwiesen. https://www.wantedly.com/companies/wantedly/post_articles/31132

Recommended Posts

Eine Geschichte, die mich während des Komponententests von der impliziten Typkonvertierung von ActiveRecord abhängig machte
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Ich war süchtig nach Unit-Tests mit dem Pufferoperator in RxJava
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Eine Geschichte, die von String () von Interface abhängig ist und von JdkDynamicAopProxy vertreten wird
[Circle CI] Eine Geschichte, der ich bei Start Building verfallen war
Ich war süchtig nach einem einfachen Test von Jedis (Java-> Redis-Bibliothek)
Eine Geschichte, die süchtig nach EntityNotFoundException von getOne of JpaRepository ist
Ich war süchtig danach, onActivityResult () mit DialogFragment zu machen
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
Ich war süchtig nach getXxxx von ResultSet, weil es ein primitiver Typ ist (Java)
Wovon ich süchtig war, als ich eine Spring Boot-Anwendung mit VS Code entwickelte
Beachten Sie, dass ich süchtig nach Stapelverarbeitung mit Spring Boot war
Beachten Sie, dass ich von den Einstellungen des Android-Projekts von IntelliJ IDEA abhängig war
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
Ich war süchtig danach, default_url_options mit der Einführung von Rails zu setzen
Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
Kintone-Klon? Ich war ziemlich süchtig danach, die OSS WebDB-Erweiterung mit Lightsail + Docker zu starten. Notieren Sie sich dies.
Ich war süchtig nach Laradock + VSCode + xdebug
Was ich mit der Redmine REST API süchtig gemacht habe
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
Eine Geschichte über die Verbindung zu einem CentOS 8-Server mit einem alten Ansible
Ein Hinweis, als ich süchtig danach war, Ubuntu auf WSL1 in WSL2 zu konvertieren
Wovon ich süchtig war, als ich die Google-Authentifizierung mit Rails implementierte
Ich war süchtig nach der API-Version min23 von registerTorchCallback
Ich war süchtig danach, sbt zu starten
Die Geschichte, ein Projekt zu bauen, das Maven mit Ant gebaut hat
Eine Geschichte, die ich mit der Stream-API von Java8 einem Prozess schreiben wollte, der einer while-Anweisung entspricht
Aufgenommen, weil ich süchtig nach der Standardeingabe der Scannerklasse war
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
Ich war ein wenig süchtig nach SSH-Verbindung von Mac zu Linux (Ubuntu)
Eine Geschichte, die süchtig nach Platzhaltern für JDBC-Vorlagen ist
Ich möchte einen Unit Test schreiben!
Ich war süchtig danach, in @ SpringApplicationConfiguration-> @SpringBootTest umzuschreiben
Ich war süchtig nach der Rollmethode
Ich war süchtig nach dem Spring-Batch-Test
Ich habe versucht, mit HCE-F von Android eine Funktion zu implementieren, die Felica Lite entspricht
Ich war ein wenig süchtig nach dem S3-Prüfsummenvergleich, machen Sie sich also eine Notiz.
Rails6 Ich möchte ein Array von Werten mit einem Kontrollkästchen erstellen
Ich habe versucht, eine Webanwendung voller Fehler mit Spring Boot zu klonen
Eine Geschichte, die mir sehr gut gefallen hat, als ich mit Ruby Triple DES gemacht habe
Ich war süchtig nach RXTX mit Sierra
Ich habe versucht, den Block mit Java zu brechen (1)
[Jackson] Eine Geschichte über das Konvertieren des Rückgabewerts des Big Decimal-Typs mit einem benutzerdefinierten Serializer.
Der Teil, dem ich in "Einführung in Ajax in Java-Webanwendungen" von NetBeans verfallen war
Java: Eine Geschichte, in der ich mich unwohl fühlte, als mir beigebracht wurde, Strings ohne Grund mit Gleichen zu vergleichen.