2015-10-13 3 views
13

Opracowaliśmy dość duży zestaw niestandardowych dopasowań jaśminu, który pomaga uczynić nasz kod czystszym i uniknąć powielania kodu. Zauważyłem, że niektóre z niestandardowych dopasowań jasmine używają testów równości === i niektórych jasmine.matchersUtil.equals. Przykład:jasmine.matchersUtil.equals vs ===

toHaveHandCursor: function() { 
    return { 
     compare: function(actual) { 
      return { 
       pass: actual.getCssValue("cursor").then(function(cursor) { 
        return cursor === "pointer"; 
       }) 
      }; 
     } 
    }; 
}, 

toBeActive: function() { 
    return { 
     compare: function(elm) { 
      return { 
       pass: protractor.promise.all([ 
        elm.getId(), 
        browser.driver.switchTo().activeElement().getId() 
       ]).then(helpers.spread(function (currentElementID, activeElementID) { 
        return jasmine.matchersUtil.equals(currentElementID, activeElementID); 
       })), 
       message: "Element is not active." 
      }; 
     } 
    }; 
} 

pytania:

co stanowi różnicę pomiędzy jasmine.matchersUtil.equals i === testów równość i który to sposób powinien być korzystne?

Innymi słowy, czy generalnie ryzykujemy, jeśli używamy tylko ===?

Odpowiedz

7

O ile mi zrozumieć, oto kilka rzeczy, które znalazłem na jasmine.matchersUtil.equals i ===:

definicji === porównuje dwa podmioty na podstawie jego value i type. Jest to operator porównania strict. Dla ex:

2 === 2 //true 
2 === 3 //false 
2 === '2' //false 
0 === -0 //true 

(Sample scenario where +0, 0 and -0 can appear)

Z drugiej strony, jasmine.matchersUtil.equals jest realizowany w oparciu o _.isEqual logiką underscore.js i testów dla równości w oparciu o logikę, która określa, czy podmioty przekazywane do niej powinny być uznawane za równe nawet jeśli ich types są różne. Coś takiego -

jasmine.matchersUtil.equals(2, 2) //true 
jasmine.matchersUtil.equals(2, 3) //false 
jasmine.matchersUtil.equals(2, '2') //false 
jasmine.matchersUtil.equals(0, -0) //false 

Oto wyciąg z niego z repo git -

// Identical objects are equal. `0 === -0`, but they aren't identical. 
if (a === b) { return a !== 0 || 1/a == 1/b; } 

EDIT: Dodatkową zaletą jasmine.matchersUtil.equals() jest to, że możemy rzeczywiście realizować własne testerów zwyczaj równości, tak aby można uniknąć kilku scenariuszy, które mogą powodować problemy. Oto próbka tester zwyczaj równości, który jest używany w poniższych przykładach -

var customTester = function(first, second) { 
    return first == second; 
}; 

kilka scenariuszy -

  1. Załóżmy, że jeśli istnieje potrzeba, aby sprawdzić, jeśli tekst elementem jest pusta lub ma jakąś konkretną wartość a tam jest dopasowujący zwyczaj jaśmin opracowany dla niego, a następnie -

    "5" === 5 //if operation on elem returns "5" then custom matcher gives false 
    jasmine.matchersUtil.equals("5", 5, customTester) //true when implemented with custom equality testers 
    
    undefined === null //if operation on elem returns undefined then custom matcher gives false 
    jasmine.matchersUtil.equals("", null, customTester) //true when implemented with custom equality testers 
    
    NaN === NaN //if operation on elem returns NaN then custom matcher gives false 
    jasmine.matchersUtil.equals(NaN, NaN) //true 
    
  2. Sprawdzenie równości obiektów jest łatwiejsze przy użyciu niestandardowych dopasowujących.Dla ex:

    {name: 'hill'} === {name: 'hill'} //false 
    jasmine.matchersUtil.equals({name: 'hill'}, {name: 'hill'}) //true 
    
  3. Check for equality of element's return value with regular expressions is easier using custom matchers rather than implementing the logic using ===.

  4. Comparison of constructors is easier.

  5. Verification of errors is handled if an error occurrence needs to be tested by passing the error object to the custom matcher.

Zawsze stosować niestandardowych dopasowujących gdy wiedzieliśmy, że mogą istnieć różne wartości inne niż oczekiwane czyjegoś które mogą się pojawić lub może wystąpić którykolwiek z powyższych warunków. Jeśli oczekiwanie jest gwarantowane jako pojedyncza wartość, to używanie wartości === ma sens. Mam nadzieję, że to pomoże.