2010-01-14 8 views
9

De acuerdo con Charlie Poole's NUnit blog, es posible usar expresiones Lambda como restricciones en NUnit 2.5. Parece que no puedo hacer que funcione? Estoy usando NUnit 2.5.3.9345.usando Lambdas como restricciones en NUnit 2.5?

Usando el ejemplo lambda de la entrada en el blog:

[TestFixture] 
public class Class1 
{ 
    [Test] 
    public void someTest() 
    { 
     int[] array = {1, 2, 3, 4}; 
     Assert.That(array, Is.All.Matches((x) => x%4 == 0 && x%100 != 0 || x%400 == 0)); 
    } 
} 

Resultados en el compilador diciendo: "No se puede convertir la expresión lambda para escribir 'NUnit.Framework.Constraints.Constraint' porque no es un tipo de delegado "

El marco de destino del ensamblado es .NET Framework 3.5. ¿Hay algo que estoy haciendo estúpidamente mal?

Respuesta

12

Creo que el compilador no puede tratar con el lambda porque no puede inferir el tipo de parámetro. Prueba esto:

Assert.That(array, Is.All.Matches((int x) => x%4 == 0 && x%100 != 0 || x%400 == 0)); 
+0

Eso funciona como debería. Un poco avergonzado no me di cuenta de mí mismo :( –

+0

El mensaje del compilador no fue particularmente explícito ... –

+0

Tuve el mismo problema, y ​​parece que no obtuve la sintaxis lambda correcta. ¡Gracias! :) – adamjford

2

La restricción Matches tiene 3 sobrecargas en la versión de NUnit que estoy usando (2.5.9), uno de los cuales es

public Constraint Matches<T>(Predicate<T> predicate) 

Así que si se pasa en el tipo parámetro en la llamada al método, que podría funcionar, así:

Assert.That(array, Is.All.Matches<int>(x => (rest of lambda body))); 
1

es posible definir una restricción en una extracción, la verificación de la versión 2.6.12296 marco NUnit, utilizando el Has.All.Matches (somepredicate).

[Test] 
    [TestCase("1000")] 
    public void ListSubOrganizationsFiltersAwayDeprecatedOrganizations(string pasId) 
    { 
     var request = ListOrganizations2GRequest.Initialize(pasId); 

     var unitsNotFiltered = OrganizationWSAgent.ListOrganizations2G(PasSystemTestProvider.PasSystemWhenTesting, request); 

     request.ValidPeriod = new ListOrganizations2GRequestValidPeriod { ValidFrom = new DateTime(2015, 3, 24), ValidFromSpecified = true }; 

     var unitsFiltered = OrganizationWSAgent.ListOrganizations2G(PasSystemTestProvider.PasSystemWhenTesting, request); 

     Assert.IsNotNull(unitsNotFiltered); 
     Assert.IsNotNull(unitsFiltered); 
     CollectionAssert.IsNotEmpty(unitsFiltered.Organization); 
     CollectionAssert.IsNotEmpty(unitsNotFiltered.Organization); 

     int[] unitIdsFiltered = unitsFiltered.Organization[0].SubsidiaryOrganization.Select(so => so.Id).ToArray(); 

     var filteredUnits = unitsNotFiltered.Organization[0].SubsidiaryOrganization 
      .Where(u => !unitIdsFiltered.Contains(u.Id)).ToList(); 

     Assert.IsNotNull(filteredUnits); 
     CollectionAssert.IsNotEmpty(filteredUnits); 
     Assert.That(filteredUnits, Has.All.Matches<OrganizationHierarchySimpleType>(ohs => (!IsValidPeriodForToday(ohs)))); 
    } 

    private static bool IsValidPeriodForToday(OrganizationHierarchySimpleType ohs) 
    { 
     return ohs.ValidPeriod != null 
       && ohs.ValidPeriod.ValidFrom <= DateTime.Now && ohs.ValidPeriod.ValidTo >= DateTime.Now; 
    }