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);
请告知。 谢谢
答案 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");
}