У меня есть Grails 2.5.0 приложение работает, и этот тест:Каков правильный синтаксис Spock для Grails?
package moduleextractor
import grails.test.mixin.TestFor
import spock.lang.Specification
/**
* See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions
*/
@TestFor(ExtractorController)
class ExtractorControllerSpec extends Specification {
def moduleDataService
def mockFile
def setup() {
moduleDataService = Mock(ModuleDataService)
mockFile = Mock(File)
}
def cleanup() {
}
void "calls the moduleDataService"() {
given: 'a term is passed'
params.termCode = termCode
when: 'the getModuleData action is called'
controller.getModuleData()
then: 'the service is called 1 time'
1 * moduleDataService.getDataFile(termCode, 'json') >> mockFile
where:
termCode = "201415"
}
}
Если я бегу grails test-app unit:spock
я получаю это:
| Tests PASSED - view reports in /home/foo/Projects/moduleExtractor/target/test-reports
Я не понимаю, почему он видит 2 теста. Я не включил spock в свой файл BuildConfig, поскольку он уже включен в Grails 2.5.0. Также тест не должен проходить, поскольку у меня пока нет службы. Почему это проходит?
Кроме того, когда я запускаю этот grails test-app ExtractorController
я получаю еще один результат:
| Running 2 unit tests...
| Running 2 unit tests... 1 of 2
| Failure: calls the moduleDataService(moduleextractor.ExtractorControllerSpec)
| Too few invocations for:
1 * moduleDataService.getDataFile(termCode, 'json') >> mockFile (0 invocations)
Unmatched invocations (ordered by similarity):
None
at org.spockframework.mock.runtime.InteractionScope.verifyInteractions(InteractionScope.java:78)
at org.spockframework.mock.runtime.MockController.leaveScope(MockController.java:76)
at moduleextractor.ExtractorControllerSpec.calls the moduleDataService(ExtractorControllerSpec.groovy:27)
| Completed 1 unit test, 1 failed in 0m 3s
| Tests FAILED - view reports in /home/foo/Projects/moduleExtractor/target/test-reports
| Error Forked Grails VM exited with error
Если я бегу grails test-app unit:
я получаю:
| Running 4 unit tests...
| Running 4 unit tests... 1 of 4
| Failure: calls the moduleDataService(moduleextractor.ExtractorControllerSpec)
| Too few invocations for:
1 * moduleDataService.getDataFile(termCode, 'json') >> mockFile (0 invocations)
Unmatched invocations (ordered by similarity):
None
at org.spockframework.mock.runtime.InteractionScope.verifyInteractions(InteractionScope.java:78)
at org.spockframework.mock.runtime.MockController.leaveScope(MockController.java:76)
at moduleextractor.ExtractorControllerSpec.calls the moduleDataService(ExtractorControllerSpec.groovy:27)
| Completed 1 unit test, 1 failed in 0m 3s
| Tests FAILED - view reports in /home/foo/Projects/moduleExtractor/target/test-reports
| Error Forked Grails VM exited with error
Прежде всего кто-то может сказать мне, что это правильный синтаксис для запуска пробные тесты?
В чем разница между наличием у команды unit
и unit:
и unit:spock
?
(Так как Спок приходит с Grails 2.5.0, он будет работать spocks тесты в любом случае.)
Что такое правильный синтаксис и почему он видит 2 теста вместо 1?
сформируйте то, что я помню, что метод «void ...» пришел с тестом (я имею в виду, что он был сгенерирован, я просто переименовал его, разве аннотация не должна быть по умолчанию?). Кроме того, вы не использовали тестовую аннотацию в своем коде. Извините, но для меня это немного сбивает с толку. –
Вы также говорите, что запускаете это: «grails test-app -unit» Я никогда раньше не видел этот синтаксис. Я, хотя двоеточие, ':' следует использовать. Однако я понимаю часть инъекции. Я должен определить свою службу в тесте! Спасибо, в любом случае! –
Исправьте, нет аннотации @Test, но имя метода начинается с «теста», который является адекватным. Существует также несколько допустимых форматов для вызова модульных тестов. «grails test-app -unit» вызывает модульные тесты. 'grail test-app unit:' вызывает модульные тесты. – railsdog