Beenden Sie externe Anforderungen, während Sie Rails-Anwendungen mit dem Videorecorder testen



    In letzter Zeit hatte ich ein Problem damit, dass die Tests meiner Anwendung schon seit geraumer Zeit laufen. Dies liegt an der Tatsache, dass einige Teile des Codes gerne auf Dienste von Drittanbietern wie iTunes und Facebook zugreifen.

    Der Zugriff auf Dienste von Drittanbietern während des Testens ist aus den folgenden Gründen schlecht:

    1. Wenn während der Ausführung der Tests Kommunikationsprobleme auftreten, können diese entweder langsam vergehen oder vollständig abfallen.
    2. Wie bereits erwähnt, ist die Geschwindigkeit des Bestehens von Tests ziemlich verlangsamt.
    3. Es kann Probleme mit der Begrenzung der Anzahl der Anforderungen durch die Dienste selbst geben.


    Ich war inspiriert, diesen Artikel zu schreiben , in dem beschrieben wird, wie Sie Anforderungen an externe Dienste entfernen und durch lokale Aufrufe ersetzen. Die folgenden Methoden werden in dem Artikel vorgestellt:

    1. Erstellen Sie einen Stich auf dem Sinatra, der sich während des Testens erhöht.
    2. Verwenden Sie die VCR-Bibliothek, mit der Sie alle externen Anforderungen mit Antworten abfangen und in eine Datei schreiben können.

    Aus eigener Erfahrung - beide Ansätze eignen sich für leicht unterschiedliche Situationen. Sinatra ist gut, wenn es eine kleine Anfrage gibt und die Antwort JSON bekannt ist. VCR ist gut, wenn bereits ein SDK von jemandem verwendet wird (in meinem Fall Koala für die Kommunikation mit Facebook), wodurch eine Anforderungskette an jemanden unter Verwendung der internen Logik der Bibliothek erstellt wird.

    In diesem Artikel konzentrieren wir uns auf die Verwendung von Videorecordern. Zum Testen wurde rspec verwendet.

    Aus Gründen der Übersichtlichkeit ist zu beachten, dass Dateien mit einer Abfragekette (und deren Inhalt) in der VCR-Ideologie als Kassetten bezeichnet werden. Dies ist im Namen der Methoden und in der Dokumentation zu sehen. Nun, der Videorecorder selbst kann wörtlich als "vidisch" übersetzt werden.

    Zunächst installieren wir den Videorecorder und das Webmock selbstanfragen nach draussen zu emulieren. Außerdem verbietet webmock alle externen Anforderungen während der Tests. Gemfile:

    group :test do
      ...
      gem 'webmock'
      gem 'vcr'
      ...
    end
    


    Fügen Sie dann spec_helper.rb hinzu:

    require 'webmock/rspec'
    require 'vcr'
    VCR.configure do |c|
      c.cassette_library_dir = 'fixtures/vcr_cassettes' #указываем директорию где у нас будут лежать файлы с цепочками запросов
      c.ignore_hosts '127.0.0.1', 'localhost'
      c.hook_into :webmock
    end
    


    Als Beispiel werde ich einen Test meiner API geben, der anschließend mehrere Anfragen an Facebook stellt.

    Diese Datei enthält einen Helfer, der einen neuen
    Testbenutzer registriert und seinen letzten Beitrag aus dem spec / support / fb_helper.rb-Feed ausgibt:

    module FbHelper
      def init_test_user
        VCR.use_cassette('fb_test_user') do
          result ={}
          test_users = Koala::Facebook::TestUsers.new(:app_id => Rails.application.config.fb_app_id, :secret => Rails.application.config.fb_app_secret)
          sandra = test_users.list.select! { |x| x["id"]=="1462678604000503" }
          @sandra_token = sandra.first['access_token']
          @graph = Koala::Facebook::API.new(@sandra_token)
          @sender_id = @graph.get_object("me")["id"]
          posts = @graph.get_connections("me", "posts")
          @post_id = posts.select {|x| x['id']=="1462678604000503_1462707207330976"}.first["id"]
          result[:sandra_token] = @sandra_token
          result[:post_id]= @post_id
          result[:sender_id] = @sender_id
          return result
        end
      end
    end
    


    Die Testspezifikationsdatei selbst / spec / orders / facebook_register_post_request_spec.rb:

    require 'spec_helper'
    describe 'проверака шэринга постов в FB' do
      let(:device) {
        FactoryGirl.create(:device,:guid=>generate_guid)
      }
      it 'должен проходить с валидными токенами и постом' do
        result = init_test_user
        start_points = device.points
        VCR.use_cassette('fb_register_post') do #используем другой файл для чтения/записи запросов
          get register_fb_post_api_path,{:id=>device.guid,:post=>result[:post_id],:sender=>result[:sender_id],:token=>result[:sandra_token]}
        end
        expect(response).to be_success
      end
    end
    


    Nach den Erfahrungen seines kleinen Projekts verringerte sich die Geschwindigkeit der bestandenen Tests von 25 Sekunden (während einer instabilen Verbindung konnte sie in 1 Minute ruhig verschwinden) auf 8 Sekunden.

    Die vollständige Dokumentation für die Bibliothek finden Sie hier .

    Jetzt auch beliebt: