Vraptor mock Result http body

10 respostas
D

Olá pessoal,

Estou testando os meus controllers e precisava pegar o conteúdo do Result. Existe algo pronto para fazer isso?

Eu pensei em extender o MockResult assim como o MockSerializationResult e implementar isso … mas se estiver pronto ajudaria, seria melhor …

Obrigado,

10 Respostas

L

o que você quer dizer com o conteúdo do result?

o html gerado?

D

Isso mesmo!

Quero acessar o que defini através de result.use(http()).body()

Valeu,

L

nesse caso dá pra fazer um cara bem parecido com o MockSerialization mesmo…

se fosse algo no JSP é que seria meio difícil de fazer.

não lembro de ter visto esse mock, mas se quiser ajuda pra implementar dá um toque, e se quiser fazer um pull request seria muito bem vindo =)

D

Então … eu comecei a fazer aqui mas não deu muito certo. Agora que você se propôs a dar um help vou tentar novamente… :slight_smile:

Sorry, eu não entendi o que você disse aqui

Lucas Cavalcanti:

não lembro de ter visto esse mock, mas se quiser ajuda pra implementar dá um toque, e se quiser fazer um pull request seria muito bem vindo =)

Legal!!

D

Lucas,

Você recomenda levar essa discussão para uma PullRequest ou deixar por aqui mesmo?

Eu pensei em fazer no meu mock:

result = new MockSerializationResult();
myController = new MyController(result);
...
myController.doStuff();
String json = result.serializedResult();

MyController#doStuff:

@Get
@Path("doStuff")
public void getData(String itemName){
	...
	result.use(Results.http()).addHeader("Content-Type", "application/json").body(json);
}

Porém, debugando a classe MockSerialization, percebi que o response.getContentType() não foi setado ao fazer addHeader(“Content-Type”, “application/json”). Tenho a impressão que as responses ou o tempo que elas são usadas não são o mesmo:

/**
	 * Retrieve the string with the serialized (JSON/XML) Object if have one as response. 
	 * 
	 * @return String with the object serialized 
	 */
	public String serializedResult() throws Exception {
		
		if("application/xml".equals(response.getContentType())){
			return response.getContentAsString();
		}
		
		if("application/json".equals(response.getContentType())){
			return response.getContentAsString();
		}
		
		return null;
	}

Obrigado,

L

não dá pra usar o mockSerializationResult, pq ele só funciona com results que são Serialization (json(), xml() e representation())

precisa criar um mock result inspirado nele…

seria algo como mudar o instanceView para instanciar ou mockar o HttpResult, acumulando o body e os headers.
use o mockResponse e passe pra esse cara:

deve funcionar.

D

Implementado … não sei se está muito simplista, mas resolveu meu caso de testes aqui :slight_smile:

Também não sabia como iniciar direito o DefaultStatus … mas passei uns null e funcionou.

Veja se está legal:

public class MockResultHttp extends MockResult{
	private MockHttpServletResponse response = new MockHttpServletResponse();
	
	public MockResultHttp() {
		super(new CglibProxifier(new ObjenesisInstanceCreator()));
	}
	
	@Override
	public <T extends View> T use(Class<T> view) {
		if (view.isAssignableFrom(HttpResult.class)){
			DefaultHttpResult defaultHttpResult = new DefaultHttpResult(response, new DefaultStatus(response, this, null, proxifier, null));
			return view.cast(defaultHttpResult);
		}
		
		return proxifier.proxify(view, returnOnFinalMethods(view));
	}
	
	public String getBody(){
		response.getWriter().flush();
		return response.getContentAsString();
	}
}
L

parece legal!

talvez adicionar um método pra ver os headers/content-type tb =)

manda um pull request com isso, plz?

D

Já está lá:
https://github.com/caelum/vraptor/pull/484

Só falta verificar se vai deixar com este nome a classe mesmo.

Lucas Cavalcanti:
parece legal!

talvez adicionar um método pra ver os headers/content-type tb =)

manda um pull request com isso, plz?

L

fiz uns comentários lá =)

Criado 19 de dezembro de 2012
Ultima resposta 20 de dez. de 2012
Respostas 10
Participantes 2