2015-02-26 4 views
11

Один из моих тестов ожидает, что текст сообщения об ошибке будет одним из нескольких значений. Начиная с getText() возвращает обещание Я не могу использовать toContain() жасмина. Ниже не будет работать, так как protractor (jasminewd под капотом) не разрешило бы обещание во второй части согласовани, toContain() в этом случае:Ожидайте элемент в массиве

expect(["Unknown Error", "Connection Error"]).toContain(page.errorMessage.getText()); 

Вопрос: Есть ли способ, чтобы проверить если элемент находится в массиве с жасмином + транспортиром, где элемент является обещанием?

Других слов, я ищу обратную toContain() так, что expect() бы косвенно решить обещание, переданное в


В качестве обходного пути, я могу явно разрешить обещание с then():.

page.errorMessage.getText().then(function (text) { 
    expect(["Unknown Error", "Connection Error"]).toContain(text); 
}); 

Я не уверен, что это лучший вариант. Я также был бы в порядке с решением, основанным на сторонних моделях, таких как jasmine-matchers.


В качестве примера такого рода утверждения существует в Python:

self.assertIn(1, [1, 2, 3, 4]) 
+0

Использовать 'chai-as-обещанный' –

+0

@BenjaminGruenbaum, если бы вы могли разработать предложение в ответе с примером - было бы здорово, так как это звучит как хороший законный альтернативный вариант для пользовательского совпадения. Спасибо! – alecxe

+0

В общем, мне не нравится предлагать библиотеки в качестве ответов на вопросы, так как это дает рекомендации по библиотечным вопросам - я сказал, что на самом деле это, вероятно, лучшая альтернатива в этом случае. –

ответ

12

Похоже, вам нужен пользовательский Искатель. В зависимости от версии Jasmine вы используете:

С Жасмин 1:

this.addMatchers({ 
    toBeIn: function(expected) { 
     var possibilities = Array.isArray(expected) ? expected : [expected]; 
     return possibilities.indexOf(this.actual) > -1; 
    } 
}); 


С Жасмин 2:

this.addMatchers({ 
    toBeIn: function(util, customEqualityTesters) { 
     return { 
      compare: function(actual, expected) { 
       var possibilities = Array.isArray(expected) ? expected : [expected]; 
       var passed = possibilities.indexOf(actual) > -1; 

       return { 
        pass: passed, 
        message: 'Expected [' + possibilities.join(', ') + ']' + (passed ? ' not' : '') + ' to contain ' + actual 
       }; 
      } 
     }; 
    } 
}); 


Вы должны выполнить это раздел beforeEach на каждом из ваших блоков describe, в котором он будет использоваться.

Вы ожидаете будет выглядеть так:

expect(page.errorMessage.getText()).toBeIn(["Unknown Error", "Connection Error"]); 
5

Альтернативным решением является использование .toMatch() Искателя с Regular Expressions и, в частности особый характер | (так называемый «или»), что позволяет соответствовать только один вход в успех:

expect(page.errorMessage.getText()).toMatch(/Unknown Error|Connection Error/); 
3

Для меня обходного, что вы определили I лучшее решение. Однако мы не должны забывать, что это асинхронное выполнение и вы можете рассмотреть Jasmine's asynchronous support.

Затем ваш тест будет выглядеть следующим образом одно:

it('should check item is in array', function(done){ //Note the argument for callback 

    // do your stuff/prerequisites for the spec here 

    page.errorMessage.getText().then(function (text) { 
     expect(["Unknown Error", "Connection Error"]).toContain(text); 
     done(); // Spec is done! 
    }); 
}); 

Примечание: Если вы не сдадите этот done аргумент в spec callback, он будет работать до завершения без сбоев, но в результатах исполнения для этой спецификации не сообщается никаких утверждений (другими словами, эта спецификация будет иметь утверждения 0), и это может привести к путаницам.

Смежные вопросы