NSubstitute 能否检查采用 Expression<T> 的调用?

Can NSubstitute check calls that take an Expression<T>?

我正在尝试验证对采用 Expression<Func<T, U>> 类型参数的方法的调用,但我无法让 NSubstitute 识别它。

public interface IFoo<T>
{
    void DoThing<TProperty>(TProperty i, Expression<Func<T, TProperty>> expression);
}

// this almost works, but throws AmbiguousArgumentException
myFoo.Received(1).DoThing(Arg.Is(10), Arg.Any<Expression<Func<MyClassType, long>>>());

是的,NSubstitute 可以处理采用表达式的调用。我通过了以下测试:

public class MyClassType {
    public long Property { get; set; }
}
public interface IFoo {
    void DoThing(int i, Expression<Func<MyClassType, long>> expression);
}

[Test]
public void ReceivedWithAnyExpression() {
    var myObj = Substitute.For<IFoo> ();
    myObj.DoThing (10, x => x.Property);
    myObj.Received(1).DoThing(Arg.Is(10), Arg.Any<Expression<Func<MyClassType, long>>>());
}

您遇到的编译错误是什么?

因此,在试图弄清楚为什么我的测试失败但 David Tchepak 有效时,我意识到我最初的问题没有包括 属性 的类型也是通用的这一事实(问题已更新) .当我对 David 的代码进行更改时,我开始看到与原始代码中相同的错误。

我找到了解决方案,但是:

// fails with AmbiguousArgumentException
myObj.Received(1).DoThing(Arg.Is(10), Arg.Any<Expression<Fun<MyClassType, long>>>());

// passes, but doesn't validate first parameter
myObj.Received(1).DoThing(Arg.Any<long>(), Arg.Any<Expression<Fun<MyClassType, long>>>());

// passes, _and_validates first parameter
myObj.Received(1).DoThing(10, Arg.Any<Expression<Fun<MyClassType, long>>>());

// passes, _and_validates first parameter
myObj.Received(1).DoThing(Arg.Is<long>(10), Arg.Any<Expression<Fun<MyClassType, long>>>());