Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

1

18.12.2015, 16:39

Javascript und Jasmine

Hi,
für JS Unit Tests wollte ich Jasmine verwenden, das Hinzufügen funktioniert auch.
Wenn ich aber bei der "expect" Funktion die Methoden aus anderen JavaScript Dateien aufrufen will, bekomme ich folgenden Fehler:

Zitat

ReferenceError: methodenname1 is not defined

Die JavaScript Dateien, in dem Fall z.b. script1.js, welches methodenname1() enthält, habe ich auch in den "src" Ordner von Jasmine kopiert und in der SpecRunner.html "<script src="src/script1.js"></script>" angegeben.

Kennt sich hier jemand damit aus?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

18.12.2015, 16:59

Sieht so aus als wäre die methodenname1 nicht definiert ;)
Gib uns mal deinen code, sonst wird das nur rumgerate.
Ich denke mal du musst du Funktionf ür Jasmine noch irgendwie registrieren?

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

3

18.12.2015, 18:26

Mit JavaScript hab ich noch nicht so viel gemacht, vermutlich sind die Scripte falsch im Unit Test Framework eingebunden?

jasmine\SpecRunner.html

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Jasmine Spec Runner v2.4.0</title>

  <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.4.0/jasmine_favicon.png">
  <link rel="stylesheet" href="lib/jasmine-2.4.0/jasmine.css">

  <script src="lib/jasmine-2.4.0/jasmine.js"></script>
  <script src="lib/jasmine-2.4.0/jasmine-html.js"></script>
  <script src="lib/jasmine-2.4.0/boot.js"></script>

  <!-- include source files here... -->
  <script src="src/script1.js"></script>

  <!-- include spec files here... -->
  <script src="spec/Spec1.js"></script>

</head>

<body>
</body>
</html>


jasmine\spec\Spec1.js

Quellcode

1
2
3
4
5
describe("Funktion1", function() {
  it("Methode1", function() {
    expect(methodenname1()).toContain("Wert1");
  });
});


jasmine/src/script1.js

Quellcode

1
2
3
function methodenname1() {
return "Wert1";
}

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

18.12.2015, 18:58

Funktioniert bei mir.
Habs dir mal zusammen gepackt.

Guck mal ob alle Dateien geladen werden (F12 -> Konsole).

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

5

18.12.2015, 19:44

Dein Unit Test funktioniert. Hab meine Scripte noch mal durchgeschaut und einen fehlenden Doppelpunkt entdeckt, dann war das also die Fehlerquelle. Danke schon mal für testen!

Hab zu Jasmin gleich noch eine Frage: methode1() ruft wiederum eine asynchrone Methode auf, für ein HTTP POST Request. Wie kann ich mit Jasmine die response Variable auf einen bestimmten Wert überprüfen, bei dem die Überprüfung aber erst ausgeführt wird, nachdem die Asynchrone Methode fertig wurde?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var response = '';

function methodenname1() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (xhttp.readyState == 4 && xhttp.status == 200) {
            //Bei erfolgreichem HTTP POST Request die empfangenen Daten in die respnse Variable schreiben
            response = xhttp.responseText;
        }
    };
    xhttp.open("POST", LOGIN_URL, true);

    xhttp.send();
    //...
    return response;
}

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

18.12.2015, 19:50

Ich kenne Jasmine auch nicht aber dieses done() klingt vielversprechend: http://www.htmlgoodies.com/beyond/javasc…-processes.html

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

7

18.12.2015, 20:39

Die Jasmine done() Funktion könnte das sein was ich suche.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
describe("Methode1", function() {
    beforeEach(function(done) {
     methdoe1({
        success: function () {
          done();
        }
      });
    });
    
  it("Server request", function(done) {
    expect(response).toContain("wert1");
  });
});


Beim Ausführen von methodenname1() bekomme ich in der Chrome Entwickler Console folgenden Fehler:

Zitat

XMLHttpRequest cannot load https://servername.de. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

Das HTTP POST Request wird also vermutlich noch nicht ausgeführt, obwohl ich den gewünschten Header mit versende.
Warum wird das HTTP Request blockiert?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
function methodenname1() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (xhttp.readyState == 4 && xhttp.status == 200) {
            //Bei erfolgreichem HTTP POST Request die empfangenen Daten in die respnse Variable schreiben
            response = xhttp.responseText;
        }
    };
    xhttp.open("POST", LOGIN_URL, true);

    xhttp.send("\"Access-Control-Allow-Origin\":\"*\"");
    return response;

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

18.12.2015, 22:02

Der Header muss vom Server geliefert werden, nicht vom Client - sonst wäre das Sicherheitsfeature ja total witzlos. Lässt du das lokal laufen? Dann machen solche Requests ohnehin Probleme.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

9

19.12.2015, 01:40

In einem Unit Test will man eh keine Anfragen an einen echten Server stellen. Das geht dann schon in Richtung Integrationstest. In Unit Tests mockt man Abhängigkeiten. Das geht z.B. mit SinonJS: http://sinonjs.org/docs/#server

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

10

19.12.2015, 12:44

Zum testen hab ich das Script lokal laufen lassen, später soll es mit PhoneGap in eine App konvertiert werden.
An solche Sicherheitsfeatures für HTTP Requests hab ich nicht gedacht, das macht das Testen ja dann umständlicher.
Mal schauen, vielleicht setzte ich die App dann doch wieder als native Anwendung um, es gibt in der HTML5 Entwicklung doch einiges zu beachten.

Werbeanzeige