C# Moq模拟泛型和表达式函数

C# Moq模拟泛型和表达式函数,c#,unit-testing,generics,mocking,moq,C#,Unit Testing,Generics,Mocking,Moq,当我试图模仿一名代表时,我遇到了一些问题。到目前为止,我得到的是: 接口规格: TResult FindOne<T, TResult>( ISpecification<T> criteria, Expression<Func<T, TResult>> property) where T : class; public virtual TResult FindOne<T, TResult>( ISpecifica

当我试图模仿一名代表时,我遇到了一些问题。到目前为止,我得到的是:

接口规格:

TResult FindOne<T, TResult>(
    ISpecification<T> criteria, Expression<Func<T, TResult>> property)
    where T : class;
public virtual TResult FindOne<T, TResult>(
    ISpecification<T> criteria, Expression<Func<T, TResult>> property)
    where T : class
{
      return criteria.SatisfyingItemFrom(GetQuery<T>(), property);
}
到目前为止我的模拟(不起作用):

\u仓库仓储模拟
.Setup(x=>x.FindOne(It.IsAny()),
It.IsAny())
.Returns(TestLine.Id);
我得到的错误是:

Moq.MockException:IGenericRepository.FindOne(规范`1[Line],Line=>Line.Id)调用失败,模拟行为严格。 模拟上的所有调用都必须有相应的设置


但是我不确定如何将line=>line.Id发送到我的mock中

据我所知,
It.IsAny()
子句必须与声明匹配

使用

TResult FindOne<T, TResult>(
    ISpecification<T> criteria,
    Expression<Func<T, TResult>> property) where T : class;
因此,设置必须是

_warehouseRepositoryMock.Setup(x => x.FindOne(
    It.IsAny<ISpecification<Line>>(),
    It.IsAny<Expression<Func<Line, string>>>())).Returns(TestLine.Id);

什么类型是
line.Id
?它是一个字符串,但当我从一个对象更改为另一个字符串时,它会给出相同的错误。您是否尝试使用
isspecification
而不是
MySpecification
\u warehouseRepositoryMock.Setup(x=>x.FindOne(It.IsAny(),It.IsAny())。返回(TestLine.Id)?谢谢abto-我想是函数调用失败了-我不认为是因为ISpec。非常感谢你
TResult FindOne<T, TResult>(
    ISpecification<T> criteria,
    Expression<Func<T, TResult>> property) where T : class;
string FindOne(
    ISpecification<Line> criteria,
    Expression<Func<Line, string>> property);
_warehouseRepositoryMock.Setup(x => x.FindOne(
    It.IsAny<ISpecification<Line>>(),
    It.IsAny<Expression<Func<Line, string>>>())).Returns(TestLine.Id);
_warehouseRepositoryMock.Setup(x => x.FindOne(
    It.Is<ISpecification<Line>>(s => s is MySpecification),
    It.IsAny<Expression<Func<Line, string>>>())).Returns(TestLine.Id);