Probleme beim Hinzufügen eines einfachen Unit-Tests für Youtube Oneboxing

Hallo!

Ich möchte die Unterstützung für YouTube-Links vom Typ /shorts/ hinzufügen.

Meine Modifikation der YoutubeOnebox-Klasse funktioniert, aber es ist erforderlich, dass ich einen Test in youtube_onebox.rb hinzufüge, und mein Test funktioniert nicht.

Ähnlich wie beim Test "can parse youtube embed results" habe ich diesen Code hinzugefügt:

it "kann YouTube Shorts-Ergebnisse parsen" do
  preview = expect(Onebox.preview('https://www.youtube.com/watch?v=wi2jAtpBl0Y').placeholder_html)
  preview.to match(/From which sound/)
  preview.to match(/hqdefault/)
end

Ich habe auch dies am Anfang der Datei in before do hinzugefügt:

stub_request(:get, "https://www.youtube.com/shorts/wi2jAtpBl0Y").to_return(status: 200, body: onebox_response("youtube-shorts"))

Ich habe noch nie Unit-Tests durchgeführt, daher verstehe ich all das nicht wirklich.

Mein Testfehler:

Failures:

  1) Onebox::Engine::YoutubeOnebox kann YouTube Shorts-Ergebnisse parsen
     Failure/Error:
               http.request(request) do |response|

                 if cookie = response.get_fields('set-cookie')
                   # HACK: Wenn dies in Zukunft wieder fehlschlägt, verwenden Sie HTTP::CookieJar aus dem Gem 'http-cookie'
                   # Siehe Test: it "sendet keine Cookies an die falsche Domain"
                   redir_header = { 'Cookie' => cookie.join('; ') }
                 end

                 redir_header = nil unless redir_header.is_a? Hash

     WebMock::NetConnectNotAllowedError:
       Echte HTTP-Verbindungen sind deaktiviert. Nicht registrierte Anfrage: GET https://www.youtube.com/embed/wi2jAtpBl0Y mit Headern {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Discourse Forum Onebox v2.9.0.beta12'}

       Sie können diese Anfrage mit dem folgenden Snippet stubben:

       stub_request(:get, "https://www.youtube.com/embed/wi2jAtpBl0Y").
         with(
           headers: {
          'Accept' => '*/*',
          'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
          'User-Agent' => 'Discourse Forum Onebox v2.9.0.beta12'
           }).
         to_return(status: 200, body: "", headers: {})

       Registrierte Anfrage-Stubs:

       stub_request(:get, "https://www.youtube.com/shorts/wi2jAtpBl0Y")
       stub_request(:get, "https://www.youtube.com/embed/KCyIfcevExE")
       stub_request(:get, "https://www.youtube.com/playlist?list=PL5308B2E5749D1696")
       stub_request(:get, "http://www.youtube.com/user/googlechrome")
       stub_request(:get, "https://www.youtube.com/channel/UCL8ZULXASCc1I_oaOT0NaOQ")
       stub_request(:get, "https://www.youtube.com/watch?v=21Lk4YiASMo")
       stub_request(:get, "http://www.youtube.com/watch?v=21Lk4YiASMo")
       stub_request(:get, "https://www.youtube.com/embed/21Lk4YiASMo")
       stub_request(:get, "https://youtu.be/21Lk4YiASMo")
       stub_request(:get, "https://www.youtube.com/watch?feature=player_embedded&v=21Lk4YiASMo")

       ============================================================
     # ./lib/onebox/helpers.rb:83:in `block in fetch_response'
     # ./lib/onebox/helpers.rb:69:in `fetch_response'
     # ./lib/onebox/helpers.rb:28:in `fetch_html_doc'
     # ./lib/onebox/engine/youtube_onebox.rb:21:in `parse_embed_response'
     # ./lib/onebox/engine/youtube_onebox.rb:42:in `placeholder_html'
     # ./lib/onebox/preview.rb:28:in `placeholder_html'
     # ./spec/lib/onebox/engine/youtube_onebox_spec.rb:110:in `block (2 levels) in <main>'
     # ./spec/rails_helper.rb:328:in `block (2 levels) in <top (required)>'

Finished in 0.89418 seconds (files took 5.04 seconds to load)
17 examples, 1 failure

Failed examples:

rspec ./spec/lib/onebox/engine/youtube_onebox_spec.rb:109 # Onebox::Engine::YoutubeOnebox kann YouTube Shorts-Ergebnisse parsen

Haben Sie eine Ahnung, warum es fehlschlägt?

Außerdem, was machen diese Teile in before do?

onebox_response("youtube-embed")

Der String “youtube-embed” scheint nirgendwo im Code von Discourse verwendet zu werden, außer hier. Was ist sein Zweck?

Warum gibt es doppelte /embed/-Links und warum hat onebox_response einen anderen String-Parameter?

stub_request(:get, "https://www.youtube.com/embed/21Lk4YiASMo")
.to_return(status: 200, body: onebox_response("youtube"))
stub_request(:get, "https://www.youtube.com/embed/KCyIfcevExE")
.to_return(status: 200, body: onebox_response("youtube-embed"))
1 „Gefällt mir“

Ich bin auch nicht sehr gut darin, aber du musst diesen Stub mit genau denselben Dingen ausstatten, die YouTube zurückgeben würde. Er muss also eine Teilmenge dessen enthalten, was wget https://www.youtube.com/embed/wi2jAtpBl0Y zurückgibt. Das ist die Eingabe, die deine Spezifikation benötigt.

wc wi2jAtpBl0Y 
    6   251 65245 wi2jAtpBl0Y

Das ist eine Menge Text, um ihn zu verstehen und in deinen Stub einzufügen.

1 „Gefällt mir“

Können Sie einen Entwurf-PR mit Ihren aktuellen Änderungen öffnen? Das wird einfacher zu verfolgen und zu helfen sein. Mit den aktuellen Informationen sieht es so aus, als müssten Sie die Stub-Dateien und den Stub sowie die ausgehenden Anfragen erstellen.

2 „Gefällt mir“

Sicher, hier ist es!

3 „Gefällt mir“

Ich habe es in einem neuen PR behoben, der Ihnen als Co-Autor korrekt zugeschrieben wird:

Damit unsere Testsuite nicht von einer funktionierenden Internetverbindung (und funktionierendem Youtube) abhängt, stubben wir alle Internetanfragen, indem wir diese Aufrufe mit einer gecachten Antwort zurückgeben. Die Funktion onebox_response ruft die Datei mit einem übereinstimmenden Namen als Parameter aus dem Ordner discourse/spec/fixtures/onebox at main · discourse/discourse · GitHub auf.

Ich habe eine neue .response-Datei für Shorts hinzugefügt, damit wir einen guten Test haben, aber das war alles, was dafür notwendig war. Danke für den PR!

3 „Gefällt mir“

Testen von Shorts-Onebox:

https://youtube.com/shorts/VvoFuaLAslw

1 „Gefällt mir“

Video nicht verfügbar
Der Uploader hat dieses Video in Ihrem Land nicht verfügbar gemacht

Außerdem sollte es funktionieren :smile:

1 „Gefällt mir“

Was ist mit

?

Bei mir funktioniert es.

Kurze Frage. Hier ist die E-Mail-Benachrichtigung, die ich erhalten habe:

Die URL hier ist /embed/ und nicht /shorts/, aber das ist wohl normal?

1 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.