如何在谓词参数上使用NSubstitute返回?

时间:2019-07-15 06:43:14

标签: c# predicate nsubstitute

NSubstitute的新手,无法模拟带有谓词的方法调用的返回。 例如,我在主代码中有这个

var currReport = this.ClientRepo.Get<Report>(x => x.Uid == reportUid).FirstOrDefault();

我想在测试中做类似的事情

var parentReport = new Report(){Uid = request.ParentReportUid, Name = "Test"};
this.clientRepository.Get(Arg.Is<Expression<Func<Report, bool>>>(expr => Lambda.Eq(expr, i => i.Uid == request.ParentReportUid))).Returns(new List<Report>() { parentReport }.ToArray());

这不起作用。我已经确认request.ParentReportUid与实际方法调用中的reportUid相匹配。但仍然返回null。如果我切换到Arg.Any,则它将返回报告,例如

 this.clientRepository.Get(Arg.Any<Expression<Func<Report, bool>>>()).Returns(new List<Report>() { parentReport }.ToArray());

这是我要模拟的实际方法的签名。

 T[] Get<T>(System.Linq.Expressions.Expression<Func<T, bool>> predicate = null);

请告知。 谢谢

1 个答案:

答案 0 :(得分:1)

尝试使用NSubstitute类Arg public static T Is<T>(Expression<Predicate<T>> predicate)方法。 您没有在谓词中指定X类型。

我已经花了一些时间,并且已经有了解决方案。这是一个Neleus.LambdaCompare Nuget包。您可以使用Lambda.Eq方法。我已经尝试过了,效果很好。 在您的示例中,它应该类似于:

this.Repo.Get<Report>(Arg.Is<Expression<Func<Report, bool>>>(expr => Lambda.Eq(expr, i => i.ParentType == "1AType" && i.OwnerUid == 5))).Returns(reports);

这是我尝试过的示例,测试员是绿色。此示例与您的签名相符。

public class ExpresionClass : IExpresionClass
{
    T[] IExpresionClass.Get<T>(Expression<Func<T, bool>> predicate)
    {
        throw new NotImplementedException();
    }
}

public interface IExpresionClass
{
    T[] Get<T>(Expression<Func<T, bool>> predicate = null);
}

public interface ITestClass
{
    Person[] GetPerson();
}

public class Person
    {
        public string ParentType { get; set; }

        public int OwnerUid { get; set; }
    }

public class TestClass : ITestClass
{
    private readonly IExpresionClass expressionClass;

    public TestClass(IExpresionClass expressionClass)
    {
        this.expressionClass = expressionClass;
    }

    public Person[] GetPerson()
    {
        var test = expressionClass.Get<Person>(x => x.ParentType == "1AType" && x.OwnerUid == 10);

        return test;
    }

}

[TestMethod]
    public void DoesLinqMatch()
    {
        var person = new Person();
        person.OwnerUid = 59;
        person.ParentType = "ParentType";

        Person[] personsarray = new Person[] { person };
        var expressionClass = Substitute.For<IExpresionClass>();
        expressionClass.Get(Arg.Is<Expression<Func<Person, bool>>>(expr => Lambda.Eq(expr, i => i.ParentType == "1AType" && i.OwnerUid == 10))).Returns(personsarray);

        var cut = new TestClass(expressionClass);
        var persons = cut.GetPerson();

        persons.First().ParentType.Should().Be("ParentType");
    }