Unit testing NSSubstitute集合返回值与通用存储库

Unit testing NSSubstitute集合返回值与通用存储库,unit-testing,generics,nsubstitute,Unit Testing,Generics,Nsubstitute,我有一个MongoDB的通用存储库 这是我的获取方法: public IList<TEntity> Get<TEntity>(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null) where TEntity : class, new() { var collection = GetCollection<TEntity>(); var

我有一个MongoDB的通用存储库

这是我的获取方法:

public IList<TEntity> Get<TEntity>(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null) where TEntity : class, new()
{
    var collection = GetCollection<TEntity>();

    var query = Query<TEntity>.Where(filter);
    var entity = collection.FindAs<TEntity>(query).ToList();

    return entity;
}
关于如何模拟它,以便在单元测试中设置所需的返回值,有什么建议吗?

解决了这个问题

List<Login> loginList = new List<Login>()
            {
            };

     _mongoDAL.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>()).Returns(loginList);
List loginList=new List()
{
};
_Get(Arg.Any()).Returns(loginList);

不知道为什么使用just Returns,它会起作用。

问题是因为您将错误的类型传递给了
Returns forayargs
调用。如果您正在调用
Returns
ReturnsForAnyArgs
,则此行为是相同的

[TestMethod]
public void CheckIfUserNameExits_IfUserNameDoesNotExist_ReturnFalse()
{
    Login login = null;
    Task<IList<Login>> logl = null;
    // _mongoDAL.Get<Arg.Any<Login>()>(Arg.Any<Expression<Func<TEntity, bool>>>).ReturnsForAnyArgs
    //_mongoDAL.When(x => x.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>())).ReturnsForAnyArgs(logl);
    _mongoDAL.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>()).ReturnsForAnyArgs(logl);
}
您的
Get
方法定义为返回
IList
。在最初的问题中,您返回的是
logl
,类型为
Task
(注意
Task
包装您的
IList
)。然而,在您的示例中,您传递的是
loginList
,这是一个
列表
,它实现了
IList
,因此您的代码可以编译。因此,作为替代方案,您可以使用:

_mongoDAL.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>())
         .ReturnsForAnyArgs(loginList);
\u mongoDAL.Get(Arg.Any())
.ReturnsForAnyArgs(登录列表);
最初出现的编译错误有点神秘。完整的错误消息是:

错误CS1928:“System.Collections.Generic.IList”不包含“ReturnsFanyargs”的定义,并且最佳扩展方法重载“NSSubstitute.SubstituteExtensions.ReturnsFanyargs(System.Threading.Tasks.Task,T,params T[])具有一些无效参数

错误消息的前半部分似乎指向缺少的扩展方法。然而,事实上,问题是它无法匹配任何重载方法,因此它会选择最接近的方法,并向您展示它如何不匹配

通常,您会得到第二个错误,这将有助于表明这是您的问题。大概是这样的:

错误CS1929:实例参数:无法从“System.Collections.Generic.IList”转换为“System.Threading.Tasks.Task>>”


“…不包含任何ReturnsForAnyArgs的定义”-这听起来好像您缺少使用NSubstitute的
?是的,我已经包括在内了。:)