2013-03-03 20 views
7

To nie jest tak bardzo kwestia technologii; Widzę, że wiele osób używa Mocha, która wygląda schludnie, więc spróbuję.Praktyki testowe dla Meteor

Zastanawiam się, jak ludzie radzą sobie z testowaniem modeli, które są powiązane z kolekcjami Meteor. Czy używałbyś sinon do wyśmiewania rekordów bazy danych? Czy istnieją pliki framework, które można załadować za pomocą require, aby można było użyć Meteor.Collection?

Edit

Aby być bardziej konkretne, Piszę aplikację, która wykorzystuje kilka Minimongoid modeli. Jeśli widziałeś któryś z nich, wiesz, że właściwość każdego modelu to @_collection to new Meteor.Collection(...).

Jedną z głównych zalet posiadania modelu zamiast rekordu bazy danych jest to, że można do niego dołączyć zachowanie, a to zachowanie próbuję przetestować.

Załóżmy, że masz grę z udziałem dwóch elementów na planszy. Kiedy gracz kliknie kawałek, chcemy pokazać wszystkie ruchy prawne na planszy, podświetlając kwadraty. Utwór ma metodę, która określa, czy dane miejsce stanowi ruch legalny, w zależności od tego, jak ta część się porusza i czy są na niej inne elementy; ustalenia, czy istnieją elementy w sposób prawdopodobnie wymaga zapytania do bazy danych:

class Piece extends Minimongoid 
    @_collection: new Meteor.Collection('pieces') 

    @find: (selector = {}, options = {}) -> 
    document = @_collection.findOne(selector, options) 
    if document 
     model = new @(document) 
     _.extend(model, model.attributes) 

    @where: (selector = {}, options = {}) -> 
    @_collection.find(selector, options).map (record) => 
     model = new @(record) 
     _.extend(model, model.attributes) 

class Bishop extends Piece 
    @code: "bishop" 

    isLegalMove: (location) -> 
    @isOnMyPath(location) && @noPiecesInMyWay(location) 

    noPiecesInMyWay: (location) -> 
    _.all Piece.where({ color: @otherColor() }), (piece) -> 
     !piece.isOnMyPath(location) || (piece.location == location && piece.color == @otherColor()) 

więc jeśli załadować tę klasę w ramach testów, naprawdę tylko dwie opcje do testowania tego kodu:

  1. Mock przedmiotem @_collection z czymś sinon
  2. Have Meteor (lub jego części) ładowany przez ramy testowej tak, że moje modele mają dostęp do Meteor.Collection

Aktualizacja

Około rok później wrócił do tego i wypróbowane niektóre z proponowanych podejść do testów.

Spojrzałem na RTD, który wydawał się być najbardziej kompletnym ze wszystkich dostępnych rozwiązań, ale nie mogłem go uruchomić.

Spojrzałem również na Laika, ale naprawdę nie przejmowałem się składnią. Chcę mieć składnię stylu BDD, a to, co oferuje Laika, jest raczej zagadkowe.

Po kilku próbach i błędach udało mi się jednak zadziałać meteor-mocha-web i jak dotąd jestem z niego bardzo zadowolony. Uruchamia Twoją aplikację i pobiera pliki testowe, więc nie ma potrzeby kpić z jakiejkolwiek części frameworka. Oczywiście nie jest to perfekcyjne, ale to pierwsza rzecz, którą udało mi się uruchomić i ma ona składnię, którą preferuję, więc wygrywa. Dzięki jagill za odpowiedź!

+0

Podczas gdy zgadzam się, że testy dla dużej bazy kodu są priorytetem, jestem nieco zdezorientowany testami na Meteorze, ponieważ uważam, że obejmuje to filozofię dla MVP. Czy uważasz, że testy oparte na Meteor są niezwykle istotne? Czy planujesz zbudować aplikację na dużą skalę, wykorzystując Meteor do wdrożenia? – Prashant

+0

Chociaż wydaje mi się, że wciągasz mnie w płomienną wojnę o zalety testowania, zobaczę, czy mogę ugryźć haczyk bez naciskania przycisku. Nie ma znaczenia, czy aplikacja jest na dużą skalę i idzie do produkcji; ważne jest to, że chcę odkryć moje błędy, gdy tylko je utworzę, ponieważ są łatwiejsze do naprawienia w ten sposób. W moim przypadku używam kilku modeli Minimongoid, które mają skomplikowaną logikę dyktującą ich zachowanie; istnieje wiele okazji, aby coś poszło nie tak i łatwiej jest prowadzić mój kod za pomocą testów niż przez kliknięcie w aplikację. – Samo

+0

Nie tylko jest to łatwiejsze, ale także szybsze i bardziej skuteczne. – Samo

Odpowiedz

3

Podczas próby przetestowania naszej aplikacji napotkaliśmy podobne problemy, MadEye.io. Istnieje wiele ruchomych części i przypadków krawędziowych, więc niezbędne były zautomatyzowane pakiety. Zbudowaliśmy pakiet meteor-mocha-web, aby umożliwić testowanie w kontekście Meteor, w tym Sesja, Meteor.Collections, Deps, itp. Daliśmy też Lightning Talk w Devshop Meteor's 0 wyjaśniając go krótko.

Jest to wczesny etap, ale jest dla nas bezcenny i obejmuje więcej przypadków użycia, ponieważ ludzie ich potrzebują.

+0

Dzięki, na pewno go zobaczę! – Samo

+0

czy istnieje struktura meteorów, która może kpić z ES6 w ogóle lub importować? – Gobliins