Korzystając z Mockito za pomocą Specs2, wykonuję fałszywe usługi, aby zweryfikować ich wywołania metod.
Mój kontroler tworzy instancję wiosną. To pozwala mi traktować to jako class
zamiast object
. => Jest to niezbędne, aby można było testować controller
. Oto przykład:
@Controller
class MyController @Autowired()(val myServices: MyServices) extends Controller
Aby włączyć sprężynowe dla kontrolerów, trzeba zdefiniować Global
obiektu, jak grać! dokumentacja wyjaśnia:
object Global extends GlobalSettings {
val context = new ClassPathXmlApplicationContext("application-context.xml")
override def getControllerInstance[A](controllerClass: Class[A]): A = {
context.getBean(controllerClass)
}
}
Mój test jednostkowy nie potrzebuje wiosny; Po prostu przekazuję współpracownikom (mocks) do konstruktora.
Jednak dotyczące świadczonych szablonu przetestować tylko dla typu wyniku (OK, BadRequest, przekierowania itp ...). Rzeczywiście, zauważyłem, że wcale nie jest łatwo sprawić, aby mój test przeskanował cały wyrenderowany szablon w szczegółach (parametry wysłane do niego itp.), Tylko z testowaniem jednostki.
Tak więc, aby potwierdzić, że właściwy szablon jest wywoływany z właściwymi argumentami, ufam moim testom akceptacyjnym z uruchomieniem Selenium lub ewentualnemu testowi funkcjonalnemu, jeśli wolisz, aby skanować cały oczekiwany wynik.
2 - Wartości powrocie z usług są przekazywane do odpowiednich atrybutów szablonu
Jest to dość łatwe do sprawdzenia that..How? Opierając się na kompilatorze! Wolisz przekazać niektóre niestandardowe typy do swojego szablonu zamiast prostych operacji, na przykład: phone: String
stanie się: phone: Phone
. (prosty obiekt wartości). Dlatego nie obawiaj się przekazywać atrybutów w niezapowiedzianej kolejności do szablonu (w teście jednostkowym lub rzeczywistym kodzie produkcyjnym). Kompilator rzeczywiście ostrzeże.
Oto przykład jednego z moich testów jednostkowych (uproszczony) przy użyciu specs2: (Zauważysz użycie owijki: WithFreshMocks
). Ten case class
pozwoli odświeżyć wszystkie zmienne (w tym przypadku próbę) test po teście. Tak więc dobrym sposobem na zresetowanie mocks.
class MyControllerSpec extends Specification with Mockito {
def is =
"listAllCars should retrieve all cars" ! WithFreshMocks().listAllCarsShouldRetrieveAllCars
case class WithFreshMocks() {
val myServicesMock = mock[MyServices]
val myController = new MyController(myServicesMock)
def listAllCarsShouldRetrieveAllCars = {
val FakeGetRequest = FakeRequest() //fakeRequest needed by controller
mockListAllCarsAsReturningSomeCars()
val result = myController.listAllCars(FakeGetRequest).asInstanceOf[PlainResult] //passing fakeRequest to simulate a true request
assertOkResult(result).
and(there was one(myServicesMock).listAllCars()) //verify that there is one and only one call of listAllCars. If listAllCars would take any parameters that you expected to be called, you could have precise them.
}
private def mockListAllCarsAsReturningSomeCars() {
myServicesMock.listAllCars() returns List[Cars](Car("ferrari"), Car("porsche"))
}
private def assertOkResult(result: PlainResult) = result.header.status must_== 200
}
Dlaczego nie używać ScalaCheck/ScalaTest/Specs2 .0? – 4lex1v
W szczególności, w jaki sposób utworzyć test za pomocą specyfikacji2.0, aby przechwycić połączenie do usługi i wywołanie szablonu? Przykłady, które udało mi się zobaczyć testują aplikację jako całość (zintegrowaną) –