2008-12-16 44 views
11

¿Cómo se supone que debe probar un servicio web en C# con Visual Studio 2008? Cuando genero una prueba de unidad, agrega una referencia real a la clase de servicio web en lugar de una referencia web. En él se establecen los atributos especificados en:Cómo probar el servicio web de C# con Visual Studio 2008

http://msdn.microsoft.com/en-us/library/ms243399(VS.80).aspx#TestingWebServiceLocally

Sin embargo, se completará sin ejecutar la prueba. Intenté agregar la llamada al WebServiceHelper.TryUrlRedirection(...) pero a la llamada no le gusta el objetivo ya que hereda de WebService, no de WebClientProtocol.

+1

¿Qué tipo de proyecto está utilizando para el servicio web? ¿Es esto un WCF asmx? ¿Es el sitio web o la aplicación web – JoshBerke

+0

? No es WCF. Es solo un servicio web normal de asmx. –

Respuesta

24

Lo que suelo hacer es no probar directamente contra el servicio web, sino intentar poner la menor cantidad de código posible en el servicio y llamar a una clase diferente que haga todo el trabajo real. Luego escribo pruebas unitarias para esa otra clase. Resulta que la clase a veces puede ser útil fuera del contexto del servicio web, así que de esta manera, ganas dos veces.

+0

Gran respuesta. Te daría más si pudiera. Es desafortunado que la cosa más grande que hace que los servicios web .asmx sean difíciles de probar es el hecho de que todo el método está decorado con [WebService] (que designa el método como un método de servicio web). La creación de una interfaz y una clase falsa no funciona. Derivar un "Fake" no funciona. La sugerencia de Doron parece ser la forma más fácil. Lo curioso es que cuando extraigo la funcionalidad en una clase verificable, a menudo llamo a esa clase un Servicio. Entonces, el que acabo de crear es en realidad un servicio para un servicio web. Puedes imaginar cómo se veía el nombre de la clase :) – SideFX

1

Puede agregar una referencia de servicio al proyecto de prueba de su unidad o generar su talón de cliente y poner la clase en su proyecto de prueba de unidad.

+0

Sí, lo hice.Solo tenía curiosidad de cómo se suponía que debías hacerlo de la "manera de Microsoft". También es la forma en que los documentos de MSDN especifican y cómo se autogenera la prueba unitaria. –

+0

mi mal me perdí esa parte. Siempre mantengo mi implementación de servicios web lo más pequeña posible y, en cambio, pruebo mis objetos mucho más fácilmente ;-) – JoshBerke

8

Si está escribiendo un servicio web, intente poner toda la lógica en otra capa (comprobable). Cada método web debe tener un pequeño código como sea posible. Entonces tendrá pocas razones para probar el método web directamente porque puede probar las capas subyacentes.

[WebMethod] 
public void DoSomething() 
{ 
    hander.DoSomething(); 
} 

Si usted está consumiendo un método web, envuelva la persona que llama generada en un contenedor de clase, e implementar una interfaz para el contenedor de clase. Luego, cada vez que necesite llamar al servicio web, use la interfaz para llamar al método. Desea utilizar la interfaz para que la envoltura de clase se pueda intercambiar durante la prueba (utilizando Rhino Mocks, Moq o TypeMock).

0

Por encima de mis pruebas de unidad método Web, Tengo el siguiente:

// TODO: Ensure that the UrlToTest attribute specifies a URL to an ASP.NET page (for example, 
// http://.../Default.aspx). This is necessary for the unit test to be executed on the web server, 
// whether you are testing a page, web service, or a WCF service. 
[HostType("ASP.NET")] 
[UrlToTest("http://localhost/MyWebService")] 

Además de la habitual:

[TestMethod()] 
[DeploymentItem("MyWebService.dll")] 

Este código surgió de utilizar el Asistente de ensayo Unidad 2008 Visual Studio.

0

saber que hay dos tipos de servicio Web. Los que usted mismo escribe y quiere probar, y los que consume. Para el primero, se aplican las reglas anteriores. Sin embargo, yo diría que a veces veo a los desarrolladores probar contra servicios web externos. La lógica dicta que un servicio de terceros no es confiable y, por lo tanto, requiere muchas más pruebas. En la programación orientada a objetos, lo mejor es comprender la separación de preocupaciones de la que Martin Fowler y los demás nos hablaron. Esto significa que no deberíamos probar sistemas externos a los nuestros.

Sin embargo, me gusta escribir clases de contenedor para proporcionar una funcionalidad útil contra los servicios. Por ejemplo, Bing Maps tiene una cantidad de funciones increíblemente poderosas. Escribo pruebas contra estos solo para asegurarme de que me den los valores esperados. Aunque no es extenso, el punto de ellos es que si el servicio web muere por algún motivo (la clave de autenticación caduca, etc.) entonces puedo ser informado a través del servidor de prueba.

Cuestiones relacionadas