it-swarm.com.de

toBe (wahr) vs toBeTruthy () vs toBeTrue ()

Was ist der Unterschied zwischen expect(something).toBe(true), expect(something).toBeTruthy() und expect(something).toBeTrue()?

Beachten Sie, dass toBeTrue() ein benutzerdefinierter Matcher ist, der unter anderem in jasmine-matchers eingeführt wurde Praktische Matcher wie toHaveMethod() oder toBeArrayOfStrings().


Die Frage ist generisch gedacht, aber als reales Beispiel teste ich, dass ein Element in protractor angezeigt wird. Welchen Matcher soll ich in diesem Fall verwenden?

expect(Elm.isDisplayed()).toBe(true);
expect(Elm.isDisplayed()).toBeTruthy();
expect(Elm.isDisplayed()).toBeTrue();
127
alecxe

Was ich mache, wenn ich mich frage, ob die hier gestellte Frage an die Quelle geht.

sein()

expect().toBe() ist definiert als:

function toBe() {
  return {
    compare: function(actual, expected) {
      return {
        pass: actual === expected
      };
    }
  };
}

Es führt seinen Test mit === Durch, was bedeutet, dass es bei Verwendung als expect(foo).toBe(true) nur dann erfolgreich ist, wenn foo tatsächlich den Wert true hat. Wahrheitswerte werden den Test nicht bestehen.

toBeTruthy ()

expect().toBeTruthy() ist definiert als:

function toBeTruthy() {
  return {
    compare: function(actual) {
      return {
        pass: !!actual
      };
    }
  };
}

Geben Sie Zwang ein

Ein Wert ist wahr, wenn das Erzwingen dieses Werts zu einem Booleschen Wert den Wert true ergibt. Die Operation !! Prüft die Richtigkeit, indem der an expect übergebene Wert in einen Booleschen Wert umgewandelt wird. Beachten Sie, dass im Gegensatz zu der derzeit akzeptierten Antwort impliziert , == true nicht ein korrekter Test für die Richtigkeit ist. Sie werden lustige Dinge wie bekommen

> "hello" == true
false
> "" == true
false
> [] == true
false
> [1, 2, 3] == true
false

Mit !! Erhalten Sie:

> !!"hello"
true
> !!""
false
> !![1, 2, 3]
true
> !![] 
true

(Ja, leer oder nicht, ein Array ist wahr.)

toBeTrue ()

expect().toBeTrue() ist Teil von Jasmine-Matchers (das bei npm als jasmine-expect registriert wird, nachdem ein späteres Projekt zuerst jasmine-matchers registriert hat).

expect().toBeTrue() ist definiert als:

function toBeTrue(actual) {
  return actual === true ||
    is(actual, 'Boolean') &&
    actual.valueOf();
}

Der Unterschied zu expect().toBeTrue() und expect().toBe(true) besteht darin, dass expect().toBeTrue() prüft, ob es sich um ein Boolean Objekt handelt. expect(new Boolean(true)).toBe(true) würde fehlschlagen, während expect(new Boolean(true)).toBeTrue() bestehen würde. Dies ist wegen dieser lustigen Sache:

> new Boolean(true) === true
false
> new Boolean(true) === false
false

Zumindest ist es wahr:

> !!new Boolean(true)
true

Welches ist am besten für die Verwendung mit elem.isDisplayed() geeignet?

Letztendlich übergibt Winkelmesser diese Anfrage an Selen. Die Dokumentation besagt, dass der von .isDisplayed() erzeugte Wert ein Versprechen ist, das in ein boolean aufgelöst wird. Ich würde es zum Nennwert nehmen und .toBeTrue() oder .toBe(true) verwenden. Wenn ich einen Fall finden würde, in dem die Implementierung wahrheitsgemäße/falsche Werte zurückgibt, würde ich einen Fehlerbericht einreichen.

178
Louis

In Javascript gibt es Wahrheiten und Wahrheiten. Wenn etwas wahr ist, ist es offensichtlich wahr oder falsch. Wenn etwas wahr ist, kann es ein Boolescher Wert sein oder nicht, aber der "Cast" -Wert von ist ein Boolescher Wert.

Beispiele.

true == true; // (true) true
1 == true; // (true) truthy
"hello" == true;  // (true) truthy
[1, 2, 3] == true; // (true) truthy
[] == false; // (true) truthy
false == false; // (true) true
0 == false; // (true) truthy
"" == false; // (true) truthy
undefined == false; // (true) truthy
null == false; // (true) truthy

Dies kann die Arbeit vereinfachen, wenn Sie überprüfen möchten, ob eine Zeichenfolge festgelegt ist oder ein Array Werte enthält.

var users = [];

if(users) {
  // this array is populated. do something with the array
}

var name = "";

if(!name) {
  // you forgot to enter your name!
}

Und wie gesagt. expect(something).toBe(true) und expect(something).toBeTrue() sind gleich. Aber expect(something).toBeTruthy() ist nicht dasselbe wie beides.

15
micah

Disclamer: Dies ist nur eine wilde Vermutung

Ich weiß, dass jeder eine leicht zu lesende Liste liebt:

  • toBe(<value>) - Der zurückgegebene Wert entspricht <value>
  • toBeTrue() - Überprüft, ob der zurückgegebene Wert true ist
  • toBeTruthy() - Überprüft, ob der Wert, wenn er in einen Booleschen Wert umgewandelt wird, ein wahrer Wert ist

    Wahrheitswerte sind alle Werte, die nicht 0, '' (Leere Zeichenfolge), false, null, NaN, undefined oder [] (leeres Array) *.

    * Beachten Sie, dass bei Ausführung von !![]true zurückgegeben wird, bei Ausführung von [] == false Jedoch auch true. Es hängt davon ab, wie es implementiert wird. Mit anderen Worten: (!![]) === ([] == false)


In Ihrem Beispiel führen toBe(true) und toBeTrue() zu denselben Ergebnissen.

11
Ismael Miguel

Es gibt viele gute Antworten, ich wollte nur ein Szenario hinzufügen, in dem die Verwendung dieser Erwartungen hilfreich sein könnte. Wenn ich mit element.all(xxx) überprüfen muss, ob alle Elemente auf einmal angezeigt werden, kann ich Folgendes ausführen:

expect(element.all(xxx).isDisplayed()).toBeTruthy(); //Expectation passes
expect(element.all(xxx).isDisplayed()).toBe(true); //Expectation fails
expect(element.all(xxx).isDisplayed()).toBeTrue(); //Expectation fails

Der Grund dafür ist, dass .all() ein Array von Werten zurückgibt. Daher können alle Arten von Erwartungen (getText, isPresent usw.) mit toBeTruthy() ausgeführt werden, wenn .all() erscheint im Bild. Hoffe das hilft.

1
Girish Sortur