Vraptor mock Result http body

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,

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

o html gerado?

Isso mesmo!

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

Valeu,

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 =)

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

[quote=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 =)[/quote]
Legal!!

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,

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.

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();
	}
}

parece legal!

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

manda um pull request com isso, plz?

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

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

[quote=Lucas Cavalcanti]parece legal!

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

manda um pull request com isso, plz?[/quote]

fiz uns comentários lá =)