Como posso testar se um valor é “maior ou igual a” no Jasmine?

94

Quero confirmar que um valor é decimal (ou 0), então o número deve ser maior ou igual a zero e menor que 1.

describe('percent',function(){  

  it('should be a decimal', function() {

    var percent = insights.percent; 
    expect(percent).toBeGreaterThan(0);
    expect(percent).toBeLessThan(1);

  });

});

Como imito "> = 0"?

Bryce Johnson
fonte
Pode estar relacionado: Checando dois limites com Jasmine (entre matcher) .
alecxe
3
Experimente:expect(percent).not.toBeLessThan(0);
jcubic
2
Conforme mencionado por @Patrizio Rullo em uma resposta abaixo, seus matchers foram mesclados. Agora há um matcher toBeGreaterThanOrEqual disponível no Jasmine 2.6: jasmine.github.io/api/2.6/matchers.html#toBeGreaterThanOrEqual
Chris Parton

Respostas:

108

Achei que deveria atualizar isso, já que a API mudou nas versões mais recentes do Jasmine. A API Jasmine agora tem funções integradas para:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

Você deve usar essas funções em preferência ao conselho abaixo.

Clique aqui para obter mais informações sobre a API de matchers Jasmine


Eu sei que essa é uma questão antiga e resolvida, mas percebi que uma solução bastante simples foi perdida. Como maior ou igual a é o inverso da função menor que, tente:

expect(percent).not.toBeLessThan(0);

Nessa abordagem, o valor da porcentagem pode ser retornado por uma função assíncrona e processado como parte do fluxo de controle.

Andrew
fonte
4
Esta deve ser uma resposta aceita. Também: expect(2 + 2).not.toBe(5), expect(2 + 2).toBeGreaterThan(0),expect(2 + 2).toBeLessThan(5)
Sergei Panfilov
Isso é perigoso, porque expect(NaN).not.toBeLessThan(0);passa em vez de falhar. ( not.toBeLessThané apenas o inverso se você assumir que percenté um número. Caso contrário, não é o inverso.)
Kristian Hanekamp
Exatamente como apontado por @KristianHanekamp, ​​a expectativa não é confiável, pois também passa quando o valor de 'por cento' não é um Número (NaN).
Rohit de
69

Você só precisa executar a operação de comparação primeiro e, em seguida, verificar se ela é verdadeira.

describe('percent',function(){
  it('should be a decimal',function(){

    var percent = insights.percent;

    expect(percent >= 0).toBeTruthy();
    expect(percent).toBeLessThan(1);

  });   
});
Bryce Johnson
fonte
9
Isso funciona, mas, infelizmente, a mensagem produzida por um teste "> =" com falha não é particularmente expressiva ("espera-se que seja falso"). E por falar nisso, não há necessidade de o teste ser assíncrono (ok, apenas detalhes;).
hashchange de
2
@hashchange Com um plugin como jasmine2-custom-message , a mensagem de erro pode ser personalizada:since('expected percent to be greater than or equal to zero').expect(percent >= 0).toBeTruthy();
TachyonVortex
@TachyonVortex Parece interessante! Eu não sabia sobre aquela coisa. Para comparações comuns como >=, eu prefiro um matcher personalizado porque mantém os testes organizados (fácil de fazer, veja minha resposta abaixo), mas para comparações que surgem com menos frequência, ou não são expressivas o suficiente, esse plug-in parece ser exatamente o coisa certa. Obrigado!
hashchange de
E o expect(percent).toBeGreaterThan(-1);xD Eu não experimentei
Cyril CHAPON
15

A versão atual do Jasmine oferece suporte a toBeGreaterThan e toBeLessThan.

expect(myVariable).toBeGreaterThan(0);
DrMcCleod
fonte
1
Pergunta feita "maior ou igual a"
stealththeninja
5

Um tanto estranho, esta não é uma funcionalidade básica

Você pode adicionar um matcher personalizado como este:

JasmineExtensions.js

yourGlobal.addExtraMatchers = function () {
    var addMatcher = function (name, func) {
        func.name = name;
        jasmine.matchers[name] = func;
    };

    addMatcher("toBeGreaterThanOrEqualTo", function () {
                   return {
                       compare: function (actual, expected) {
                           return {
                               pass: actual >= expected
                           };
                       }
                   };
               }
    );
};

Na verdade, você está definindo um construtor para seu matcher - é uma função que retorna um objeto matcher.

Inclua isso antes de 'inicializar'. Os matchers básicos são carregados no momento da inicialização.

Seu arquivo html deve ter a seguinte aparência:

<!-- jasmine test framework-->
<script type="text/javascript" src="lib/jasmine-2.0.0/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-2.0.0/jasmine-html.js"></script>

<!-- custom matchers -->
<script type="text/javascript" src="Tests/JasmineExtensions.js"></script>
<!-- initialisation-->
<script type="text/javascript" src="lib/jasmine-2.0.0/boot.js"></script>

Em seguida, em seu boot.js, adicione a chamada para adicionar os matchers após jasmine ter sido definido, mas antes de jasmine.getEnv (). Get env é, na verdade, uma chamada de configuração (com um nome um tanto enganador).

Os matchers são configurados na chamada para setupCoreMatchers no construtor Env.

/**
 * ## Require &amp; Instantiate
 *
 * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference.
 */
window.jasmine = jasmineRequire.core(jasmineRequire);
yourGlobal.addExtraMatchers();

/**
 * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference.
 */
jasmineRequire.html(jasmine);

/**
 * Create the Jasmine environment. This is used to run all specs in a project.
 */
var env = jasmine.getEnv();

Eles mostram outra maneira de adicionar correspondências customizadas nos testes de amostra; no entanto, a maneira como funciona é recriar os correspondências antes de cada teste usando um beforeEach. Isso parece horrível, então pensei em usar essa abordagem.

JonnyRaa
fonte
5

Estou atrasado para isso, mas postando apenas no caso de alguém ainda visitar esta questão em busca de respostas, estou usando Jasmine versão 3.0 e como mencionado por @Patrizio Rullo você pode usar toBeGreaterThanOrEqual / toBeLessThanOrEqual .

Ele foi adicionado na versão 2.5 de acordo com as notas de lançamento - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

Por exemplo

expect(percent).toBeGreaterThanOrEqual(1,"This is optional expect failure message");

ou

expect(percent).toBeGreaterThanOrEqual(1);
Rohit
fonte
Acho que a versão do jasmine> 2.3.4 não executa as especificações em ordem. Então, se eles quiserem especificações em ordem, eles podem criar correspondências personalizadas, mas se eles concordarem com especificações não ordenadas, eles podem escolher a versão mencionada acima.
TraxX
4

Encontrei o mesmo problema hoje e, ao que parece, não é tão difícil adicionar um matcher personalizado para ele. A principal vantagem de um matcher customizado é que ele pode retornar mensagens significativas quando um teste falha.

Então aqui está o código para dois matchers .toBeAtLeast()e .toBeAtMost(), caso ajude alguém.

beforeEach( function () {

  // When beforeEach is called outside of a `describe` scope, the matchers are
  // available globally. See http://stackoverflow.com/a/11942151/508355

  jasmine.addMatchers( {

    toBeAtLeast: function () {
      return {
        compare: function ( actual, expected ) {
          var result = {};
          result.pass = actual >= expected;
          if ( result.pass ) {
            result.message = "Expected " + actual + " to be less than " + expected;
          } else {
            result.message = "Expected " + actual + " to be at least " + expected;
          }
          return result;
        }
      };
    },

    toBeAtMost: function () {
      return {
        compare: function ( actual, expected ) {
          var result = {};
          result.pass = actual <= expected;
          if ( result.pass ) {
            result.message = "Expected " + actual + " to be greater than " + expected;
          } else {
            result.message = "Expected " + actual + " to be at most " + expected;
          }
          return result;
        }
      };
    }

  } );

} );
hashchange
fonte
1

Recomendo usar este plug-in Jasmine: https://github.com/JamieMason/Jasmine-Matchers

Broda Noel
fonte
Ele contém um matcher 'dentro do intervalo', mas não um matcher 'maior ou igual' / 'menor ou igual', embora ...
Vegar
@Vegar, você pode usar expect (número) .toBeGreaterThan (número);
Broda Noel de
1

Você pode usar a função leastpara verificar se um valor é maior ou igual a algum outro valor.

Um alias de leasté gte(maior ou igual a). Vice-versa, você pode usar lte(menor ou igual a) para verificar o oposto.

Então, para responder à pergunta, você pode fazer:

expect(percent).to.be.gte(0)

Robinson Collado
fonte
Qual versão do Jasmine você usa? Acabei de atualizar do 2.6.2 para o 2.8 e ainda recebo o erro TypeError: Cannot read property 'be' of undefinedparaexpect(1).to.be.gte(-1);
Jonathan Parent Lévesque