Pokazywanie postów oznaczonych etykietą TDD. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą TDD. Pokaż wszystkie posty

poniedziałek, 5 grudnia 2011

Testowanie kontrolerów Grails 2.0

Grailsy 2.0 (wydano już wersję RC3, więc finalna już bardzo niedługo) wprowadzają nową jakość do testowania. Porzucono całkowicie ideę (i słusznie) rozszerzenia klas dziedziczących po GrailsUnitTestCase i zastosowano tzw. mechanizm Mixins. Jest to jedna z fajnych właściwości języka Groovy, umożliwiająca dodawanie metod do klasy w runtime, więcej o niej tutaj.

Przejdźmy jednak do meritum. Poniższy kod prezentuje klasę testową kontrolera.

@TestMixin(DomainClassUnitTestMixin)
@TestFor(IndexController)
class IndexTests {

  def position

  @Before
  void setUp() {
    mockDomain(BusinessType)
    new BusinessType(name: "otherType.name").save()
  }

  @Test
  void shouldReturnLocatedPosition() {
      assert controller.index().position == position
  }
}

Dla osób, które pisały w Grails w wersji 1.x niektóre elementy wydadzą się znajome, a mianowicie metody mockDomain oraz obiekt controller. Jednakże tutaj uzyskujemy je dzięki adnotacjom @TestMixin oraz @TestFor.

TestFor jest standardową adnotacją, gdy chcemy testować, któreś z elementów MVC w Grails 2.0. Automatycznie rozpozna on typ klasy (Controller, Domain...) oraz wstrzyknie odpowiednie metody. Dla testów kontrolerów są to między innymi obiekt controller oraz obiekt response. Więcej o nich jednak w dokumentacji.

Druga adnotacja @TestMixin służy do łączenia testów różnych elementów MVC. W podanym przykładzie jako argument podałem DomainClassUnitTestMixin, co umożliwia mi wykorzystanie metody mockDomain, która to działa analogicznie z metodą mockDomain w GrailsUnitTestCase znaną z wersji 1.x.

Gdy chcemy testować z użyciem klas Domain, możemy także posłużyć się adnotacją @Mock([BusinessType]), która to automatycznie wykona metodę mockDomain (w tym przypadku nie musimy już korzystać z @TestMixin).

środa, 16 listopada 2011

Partial Mock

Partial mock jest to sposób na "udawanie" tylko niektórych metod z obiektu. W ten sposób, gdy chcemy aby obiekt działał normalnie, a chcemy w jakimś celu skorzystać z funkcjonalności frameworka do obiektów pozornych możemy to uczynić.

W Grailsach jest to przydatne narzędzie, ponieważ często używane są dynamicznie wstrzykiwane metody (np. do kontrolerów) do których nie mamy dostępu w środowisku testowym, a z których korzysta kod.

Poniższy przykład demonstruje użycie partial mock we frameworku gmock:

def controller = new SomeController()
def mockRequest = mock()
mockController.request.returns(mockRequest)

Dla instancji controller podmieniamy w tym przypadku właściwość request na nasz mockRequest. Jak widać składnia partial mock jest identyczna jak składnia przy typowych obiektach pozornych, więc skorzystanie z tej techniki będzie wyjątkowo łatwe.

sobota, 12 listopada 2011

Grails 2.0

W związku z niedługim wydaniem nowej wersji Grails postanowiłem zacząć pisać bloga o tej technologii. Postaram się tutaj opisywać raczej ciekawostki i nowości niż samouczek dla początkujących, ponieważ takich trochę w internecie jest, ale znajdą się tutaj też informacje na różnym stopniu zaawansowania. Na początek pójdzie testowanie z użyciem GMock. Pierwszy wpis już wkrótce.