Как я могу использовать rspe c правильно? - PullRequest
0 голосов
/ 17 февраля 2020

Мой код создает GitHub Gist, используя GitHub API. После создания сущности API возвращает мне код состояния. Если код «201», суть была создана. Но если это «400», то произошла ошибка. В моем коде переменная, которая сохраняет это состояние: response_status

Это мой код:

require 'net/http'
require 'json'
require 'uri'

class Gist
   attr_reader :response_status
   attr_reader :try_again

   def initialize(filename,description,state,content)
       @filename = filename
       @description = description
       @state = state
       @content = content
   end

   def post(uri, request)
       request.basic_auth("my_username", "my_token")

       request.body = JSON.dump({
           "description" => @description,
           "public" => @state,
           "files" => {
               @filename => {
                   "content" => @content
               }
           }
       })

       req_options = { use_ssl: uri.scheme == "https" }

       begin
           response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
               http.request(request)
       end

       json = response.body
       parsed = JSON.parse(json)
       @response_status = "#{ response.code }"

       if @response_status == "201"
           puts "Tu gist se ha creado con exito. La URL de su gist es: "+ parsed["url"]
       end

       rescue SocketError => se
           puts "Ha ocurrido un error de conexión. Quiere intentar nuevamente?"
           @try_again = gets.chomp.capitalize
       end
   end
end

loop do
   filename= gets.chomp

   if File.exist?("#{filename}") 
       description = gets.chomp
       state = gets.chomp.capitalize

       if state == "Si" 
           state = true;
       elsif state == "No"
           state = false;
       end

       open(filename, "r") { |file| @contenido = file.read() } 
       content = @contenido
       uri = URI.parse("https://api.github.com/gists")
       request = Net::HTTP::Post.new(uri)
       gist = Gist.new(filename,description,state,content)
       gist.post(uri, request)

       break if gist.response_status == "201"
       break if gist.try_again == "No"
   else
       puts "The file does not exist"
       continue = gets.chomp.capitalize
       break if continue == "No"
   end
end

Я хочу тестировать тестовые примеры, используя rspe c, но я не понял.

Мне пришло в голову как тестовый случай, чтобы создать Gist. Например, я подумал о том, чтобы проверить, равна ли переменная, которая возвращает состояние Gist, «201», но у меня это не сработало.

Это мой файл rspe c:

require './git_clases.rb'

RSpec.describe Gist do
    describe "#Gist" do
        it "#Gist created" do
            expect(response_status)==("201")
        end
    end
end

1 Ответ

0 голосов
/ 17 февраля 2020

response_status - это метод вашего Gist объекта. Вам необходимо создать Gist объект, вызвать post и проверить response_status на вашем объекте.

RSpec.describe Gist do
  # Generally organize by method
  describe "#post" do
    # Example descriptions read grammatically correct
    # "Gist #post creates a gist"
    it "creates a gist" do
      filename = "test.txt"
      description = "testing gist"
      state = "dunno what goes here"
      content = "some test content"

      gist = described_class.new(filename, description, state, content)

      uri = URI.parse("https://api.github.com/gists")
      request = Net::HTTP::Post.new(uri)
      gist.post(uri, request)

      expect(gist.response_status).to eq 201
    end
  end
end

described_class равно Gist из RSpec.describe Gist. Предпочтительно жесткое кодирование имени класса в примере, если этот пример становится общим или имя класса меняется.

expect(gist.response_status).to eq 201 действительно expect(gist.response_status).to( eq(201) ). Это сравнивает gist.response_status с использованием сопоставителя eq(201), который просто проверяет, что он равен 201. Это может показаться немного сложным для простой проверки равенства, но это позволяет rspec предоставить широкий спектр сложных сопоставителей а также пользовательские.


Ваш post метод немного странный в том смысле, что пользователь должен инициализировать и передать URL-адрес и объект запроса. Вероятно, это должно быть сделано Джистом.

Нет необходимости превращать response_status в строку. Желательно оставить это как целое число. Если вам нужно это как строка, используйте response.code.to_s.

...