【问题标题】:Using Lambdas as Constraints in NUnit 2.5?在 NUnit 2.5 中使用 Lambda 作为约束?
【发布时间】:2010-01-14 09:26:11
【问题描述】:

根据Charlie Poole's NUnit blog,可以在 NUnit 2.5 中使用 Lambda 表达式作为约束。我似乎无法让它工作?我正在使用 NUnit 2.5.3.9345。

使用博客文章中的示例 lambda:

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

编译器的结果是: “无法将 lambda 表达式转换为类型 'NUnit.Framework.Constraints.Constraint',因为它不是委托类型”

程序集的目标框架是 .NET Framework 3.5。是不是我愚蠢地做错了什么?

【问题讨论】:

    标签: c# unit-testing nunit lambda


    【解决方案1】:

    我认为编译器无法处理 lambda,因为它无法推断参数类型。 试试这个:

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

    【讨论】:

    • 这样可以正常工作。有点惭愧,我自己没有注意到:(
    • 我遇到了同样的问题,看起来我只是没有正确理解 lambda 语法。谢谢! :)
    • 如果数组项是匿名对象怎么办?
    【解决方案2】:

    Matches 约束在我使用的 NUnit 版本 (2.5.9) 中有 3 个重载,其中之一是

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

    因此,如果您在方法调用中传入类型参数,则可能会起作用,如下所示:

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

    【讨论】:

      【解决方案3】:

      可以使用 Has.All.Matches(somepredicate) 对集合定义约束,使用 NUnit 框架版本 2.6.12296 进行测试。

          [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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-03
        • 1970-01-01
        相关资源
        最近更新 更多