Ниже приведенный ниже тестовый класс проверяет, что простой HttpService получает контент из заданного URL-адреса. Обе приведенные выше реализации демонстрируют прохождение теста, хотя одно явно неверно, потому что он создает URL-адрес с неправильным аргументом.Groovy: проверьте построение зашитого URL-адреса
Чтобы избежать этого и правильно указать поведение, которое я хочу, я хотел бы проверить, что в блоке использования тестового примера я построю один (и только один) экземпляр класса URL и что аргумент url
для конструктора правильно. A Groovy enhancement кажется, что это позволит мне добавить заявление
mockURLContext.demand.URL { assertEquals "http://www.foo.com", url }
, но что я могу обойтись без этого Groovy повышения?
Обновление: Заменено «mock» с «заглушкой» в названии, так как меня интересует только проверка состояния, а не детализации взаимодействий. У Groovy есть механизм StubFor, который я не использовал, поэтому я оставлю свой код так, как есть, но я думаю, вы могли бы просто заменить MockFor на StubFor повсюду.
import grails.test.*
import groovy.mock.interceptor.MockFor
class HttpServiceTests extends GrailsUnitTestCase {
void testGetsContentForURL() {
def content = [text : "<html><body>Hello, world</body></html>"]
def mockURLContext = new MockFor(URL.class)
mockURLContext.demand.getContent { content }
mockURLContext.use {
def httpService = new HttpService()
assertEquals content.text, httpService.getContentFor("http://www.foo.com")
}
}
}
// This is the intended implementation.
class HttpService {
def getContentFor(url) {
new URL(url).content.text
}
}
// This intentionally wrong implementation also passes the test!
class HttpService {
def getContentFor(url) {
new URL("http://www.wrongurl.com").content.text
}
}
Вы описываете интеграционные тесты, которые проверяют правильное использование HTTP, что, конечно, очень полезно. Но они будут работать медленно, благодаря этой настройке и разрыву. Я хочу запустить тысячи модульных тестов за считанные секунды и только затем выполнить более медленные интеграционные тесты, чтобы получить дополнительную обратную связь. Итак, как я могу проверить, что я написал HttpService в основном правильным образом, прежде чем переходить к более подробным (и важным) тестам интеграции, которые вы описываете? –
Я понял, благодаря этому ответу, что я должен был ссылаться на «заглушки» в вопросе, а не «издеваться», поскольку простая запись вызовов и проверка состояния были бы совершенно прекрасными (см. Http: // martinfowler .com/статьи/mocksArentStubs.html). Я уточню вопрос. –
Единственный способ узнать, правильно ли работает HttpService, - это дублировать поведение класса URL и всей скрытой инфраструктуры, которая находится за ней _absolutely точно. Вы действительно думаете, что можете это сделать? Вы точно знаете, как это реализовано? Более того, вы действительно думаете, что это стоит того? И что, если он изменится в будущей версии? – Nat