2013-02-22 2 views
6

Jestem bardzo nowa w Jasmine i natknąłem się na sytuację, w której oczekiwałbym albo String, albo zerowego. Podjęłam próbę zrobienia lub w obrębie ToEqual, ale widzę dziwne wyniki, które prowadzą mnie do przekonania, że ​​robię to niewłaściwie. Jaki jest najlepszy sposób, aby poradzić sobie z taką sytuacją?Czy można sprawdzić wiele typów w obrębie elementu toEqual w Jasmine.Js?

Być może właśnie sprawdzam, czy moje testy są złe. Czy powinienem po prostu zepsuć ten pomysł posiadania jednego testu do przetestowania obu sytuacji?

describe("Jasmine", function() { 

    //1 
    it("should be able to handle any(String) || null within toEqual for string", function() { 
     expect("aString").toEqual(jasmine.any(String) || null); 
    }); 

    //2 
    it("should be able to handle any(String) || null within toEqual for null", function() { 
     expect(null).toEqual(jasmine.any(String) || null); 
    }); 

    //3 
    it("should be able to handle null || any(String) within toEqual for string", function() { 
     expect("aString").toEqual(null || jasmine.any(String)); 
    }); 

    //4 
    it("should be able to handle null || any(String) within toEqual for null", function() { 
     expect(null).toEqual(null || jasmine.any(String)); 
    }); 
}); 
  1. Przełęcz
  2. Expected null to equal <jasmine.any(function String() { [native code] })>.
  3. Przełęcz
  4. Expected null to equal <jasmine.any(function String() { [native code] })>.

Zdaję sobie sprawę, istnieje również toBeNull(), która jest prawdopodobnie dlaczego wyniki są tak słaby, ale bez "lub" łańcuchowanie nie wiedziałem, jak to włączyć.

(Running Jasmine 1.3.1 wersji 1354556913)

rozwiązany! Pełne rozwiązanie poniżej, jeśli ktoś jest zainteresowany

describe("Jasmine", function() { 

    beforeEach(function() { 
     this.addMatchers({ 

      toBeStringOrNull: function() { 
       var actual = this.actual; 

       this.message = function() { 
        return "Expected " + actual + " to be either string or null"; 
       }; 

       return typeof actual === 'string' || actual instanceof String || actual === null; 
      } 

     }); 
    }); 

    //1 
    it("should be able to handle any(String) || null within toEqual for string", function() { 
     expect("aString").toBeStringOrNull(); 
    }); 

    //2 
    it("should be able to handle any(String) || null within toEqual for null", function() { 
     expect(null).toBeStringOrNull(); 
    }); 

    //3 
    it("should be able to handle null || any(String) within toEqual for string", function() { 
     expect("aString").toBeStringOrNull(); 
    }); 

    //4 
    it("should be able to handle null || any(String) within toEqual for null", function() { 
     expect(null).toBeStringOrNull(); 
    }); 
}); 
+0

można oczekiwać jedno wejście dać zarówno 'string' lub' null'? Nie rozumiem, dlaczego pojedyncze "oczekiwanie" wymagałoby objęcia obu przypadków. – Mathletics

+0

@Mathletics Spodziewałbym się albo, dlatego uderzam w tę ścianę. Próbowałem utworzyć test, aby podczas testów integracyjnych móc go ponownie użyć w obu przypadkach. Myślę, że zdaję sobie sprawę, że nie jest to standardowy sposób, aby to osiągnąć. – JackMorrissey

+0

Czy można pokazać przykład metody, która z jednego wejścia może potencjalnie zwrócić oba? – Mathletics

Odpowiedz

11

Napisz swój własny mechanizm dopasowywania:

toBeStringOrNull: function() { 
    var actual = this.actual; 

    this.message = function() { 
    return "Expected " + actual + " to be either string or null"; 
    } 

    return typeof actual === 'string' || actual instanceof String || actual === null; 
} 
1

Pod warunkiem, że na pewno chcesz te przypadki do pracy na tym samym teście, można napisać własny matcher. Coś jak

toBeStringOrNull: function() { 
    var actual = this.actual; 

    this.message = function() { 
    return "Expected " + actual + " to be either string or null"; 
    } 

    return jasmine.any(String) || actual === null; 
} 
+0

Spektakularny, dzięki. Myślę, że spróbuję uniknąć tego, co próbuję, ale wspaniale jest wiedzieć, że mogę zrobić coś takiego w Jasmine dość łatwo. – JackMorrissey

+1

To nie działa. powrót jaśminu. (Ciąg) oznacza, że ​​powyższy matcher zawsze zwraca wartość true. Zobacz http://stackoverflow.com/questions/8947787/object-equality-in-jasmine-custom-matcher, aby dowiedzieć się więcej o tym, jak używać jednego matchera w innym. – tukushan

+0

@tukushan Masz absolutną rację. Dzięki za korektę i wskaźnik. – JackMorrissey