Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro ao tentar usar exporta_csv no ruby 2.3.0

No exercício, é sugerido que as Classes Livro e Estoque sejam da seguinte forma:

class Livro
  def to_csv
    "#{@titulo}, #{@ano_lancamento}, #{@preco}"
  end
end


class Estoque
  # código já existente na classe

  def exporta_csv
    @livros.each do |livro|
      puts livro.to_csv
    end
  end
end

Eu criei um teste pra garantir que fosse impresso da forma correta:

require 'test/unit'
require './estoque'
require './livro'


class TestEstoque < Test::Unit::TestCase
 #...
def setup
    @estoque = Estoque.new
    @livro_algoritmos = Livro.new("Algoritmos", 100, 1998, true)
end
  def test_exporta_csv
    @estoque.adiciona @livro_algoritmos

    csv = "Algoritmos, 1998, 90.0"
    assert_equal(csv, @estoque.exporta_csv)
  end

o Resultado do meu teste:

Failure: test_exporta_csv(TestEstoque)
test_estoque.rb:38:in `test_exporta_csv'
     35:     @estoque.adiciona @livro_algoritmos
     36:

     37:     csv = "Algoritmos, 1998, 90.0"
  => 38:     assert_equal(csv, @estoque.exporta_csv)
     39:   end
     40: end
<"Algoritmos, 1998, 90.0"> expected but was
<[#<Livro:0x007fc6748258d8
  @ano_lancamento=1998,
  @possui_reimpressao=true,
  @preco=90.0,
  @titulo="Algoritmos">]>

diff:
+ [#<Livro:0x007fc6748258d8
+   @ano_lancamento=1998,
+   @possui_reimpressao=true,
+   @preco=90.0,
?   @titulo="Algoritmos, 1998, 90.0">]

Duas solucoes possiveis que encontrei foi criar a string na mao:

def exporta_csv
  string = ""
  @livros.each do |livro|
    string += livro.to_csv
  end

  string
end

ou usando inject


def exporta_csv
  @livros.inject("") do |csv, livro|
    csv += livro.to_csv
  end
end
2 respostas
solução!

Oi Heron, exatamente e acredito que você já tenha entendido também o que ocorreu, pois as suas soluções estão perfeitas.

O problema é que o retorno do exporta_csv é o resultado da última ação do método. Das suas sugestões, as duas resolvem bem o problema.

Uma outra maneira de não dar erro é simplesmente colocar um parenteses no puts...

    def exporta_csv
        @livros.each do |livro|
            puts(livro.to_csv)
        end
    end