2015-10-13 4 views
13

Мы разработали довольно большой набор специальных жасминовых коннекторов, который помогает сделать наш код более чистым и избежать дублирования кода. Я заметил, что некоторые пользовательские составители жасмина используют тестирование на равенство === и некоторые jasmine.matchersUtil.equals. Пример: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." 
      }; 
     } 
    }; 
} 

Вопрос:

В чем разница между jasmine.matchersUtil.equals и === тестирования равенства и какой метод следует предпочесть?

Другими словами, мы рискуем, если мы используем только ===?

ответ

7

Насколько я понимаю, вот несколько вещей, которые я нашел для jasmine.matchersUtil.equals и ===:

По определению, === сравнивает два объекта, основываясь на своем value и type. Его оператор сравнения strict. Для экс:

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

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

С другой стороны, jasmine.matchersUtil.equals осуществляются на основе _.isEqual логики underscorejs и тестов для равенства на основе логики, которая определяет, будет ли субъекты, переданные ему следует считать равными даже если их types отличаются. Что-то вроде этого -

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

Вот выдержка из него от мерзавца репо -

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

EDIT: Добавлено преимущество jasmine.matchersUtil.equals() в том, что мы действительно можем реализовать наши собственные тестеры пользовательские равенства, так что можно избежать нескольких сценариев, которые, как считается, создают проблемы. Вот пример тестера пользовательского равенства, который используется с ниже примеров -

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

Несколько сценариев -

  1. Предположим, если есть необходимость проверить, если элемент текста пуст или имеет определенное значение и есть согласовани заказа жасмин разработана для него, а затем -

    "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. Проверка равенства объектов проще с помощью пользовательского matchers.Для экс:

    {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.

Мы всегда использовали пользовательские matchers всякий раз, когда мы знали, что там может быть другими, чем ожидаемая СВОИМИ различными значениями которые могут возникнуть, или любое из вышеуказанных условий может произойти. Если ожидаемое значение гарантируется как одно значение, то использование === имеет смысл. Надеюсь, поможет.