2011-05-26 9 views
7

Dado el siguiente código de ejemplo, ¿cómo puedo configurar Pex para que respete mis Contratos de código?¿Cómo se configura Pex para respetar los contratos de código?

public static IEnumerable<User> Administrators(this UserGroup userGroup) 
    { 
     Contract.Requires(userGroup != null); 
     Contract.Requires(userGroup.UserList != null); 

     return userGroup.UserList.Where(ul => ul.IsAdmin == true); 
    } 

Problema actual: Cuando ejecuto Pex, sigue generando casos de prueba que infringen los contratos de código especificados.

FYI: Here are the 'Code Contracts' settings en mi archivo csproj.


EDIT: hizo algo break in SP1?

+0

¿Has probado a enviarles un correo electrónico? [email protected] – porges

+2

Creo que esto es un error. La solución de John Nicholas funciona, pero todavía no es un comportamiento correcto para PEX. El punto de usar contratos de código con pex fue que PEX recogió automáticamente los contratos de código y trató su falla como un comportamiento esperado o una prueba de aprobación. –

Respuesta

4

En primer lugar es necesario utilizar una versión mecanografiada de Requiere

uso ArgumentNullException como T

También en proyectas propiedades que necesita para contar cotracts código para utilizar la re-escritura estándar. No haga clic en afirmar en caso de fallo;)

Contract.Requires<ArgumentNullException>(i != null); 

continuación, el código será una excepción nula argumetn y PEX puede añadir un atributo a su pexmethod decir que se permite que tirarlo y creará una prueba pasajera que lanza la excepción

a continuación, puede promover los y guardar la unidad de pruebas

+0

+1: ¡Muchas gracias! Ese ajuste 'Assert on Failure' me hizo tropezar a lo grande. –

+1

sí, pasé unas horas aplastando la cara contra el teclado en ese yo;) –

+0

Creo que esto es una solución alternativa en lugar de una solución. Creo que esta solución puede no detectar una "ArgumentNullException" real que podría arrojarse desde otro lugar en el código bajo prueba. Propongo una solución alternativa, que no tiene este problema, en mi respuesta. – lexicalscope

3

Viola los contratos a propósito para verificar que se produce una excepción cuando se infringe el contrato. Mucha gente compilará los métodos de Requiere en la compilación Release, donde algunos dirían que los casos extremos deberían ser manejados. También es posible escribir un controlador de falla de contrato personalizado que no arroje una excepción o error de aserción. Si tiene un controlador de fallas de contrato personalizado que no impide una ejecución posterior, es posible que problemas aún mayores ocurran más adelante.

Lo que hace Pex es escribir las pruebas que violan un contrato para que pase cuando se lanza una excepción.

TL/DR No debe preocuparse por ello.

+0

Gracias por la información, Bryan. Sin embargo, solo curiosidad: ¿hay alguna manera en que pueda decirle a Pex que espere la excepción y que marque esa prueba verde cuando viola el contrato? –

+0

Pex debe marcar la prueba verde cuando viola el contrato automáticamente si el contrato arroja una afirmación o excepción. –

+0

Debería, pero creo que la implementación actual está rota. Estoy teniendo un problema con eso actualmente. http://stackoverflow.com/questions/5845610/contract-requires-throwing-pex-errors –

1

que tenía el mismo problema. Hay dos cosas:

1) Comprobar que la reescritura de tiempo de ejecución está activada (como sugiere John)

2) Asegúrese de que su clase de prueba está decorado con [PexClass (typeof (MiClase))]

He escrito la prueba manualmente, así que he olvidado que el atributo PexClass y los contratos fueron tratados como excepciones regulares por Pex, por lo que estaban fallando.

Honza

1

que también tuvo que encender Contract Reference Assembly a Build (también emitió el archivo de documento XML para que pueda ver los contratos en VS).

Esto parece ser necesario para que Pex entienda los contratos.

0

Existe un atributo PexAllowedContractRequiresFailure que le permite decorar su método de prueba para decirle a Pex que no genere pruebas que provoquen la falla de un requisito.

También debe habilitar "Realizar comprobación del contrato en tiempo de ejecución" en las propiedades de su solución.

[TestClass] 
public partial class MyTest 
{ 
    [PexMethod] 
    [PexAllowedContractRequiresFailure] 
    public void TestMethod(int myParam) 
    { 
     Contract.Requires(myParam > 5); 
     ... 
    } 
} 

También existe la relacionada PexAllowedContractRequiresFailureAtTypeUnderTestSurface que creo que podría ser útil si el "exige" que desea Pex de respetar son más profundas en el árbol de llamadas.

Cuestiones relacionadas