Unit testing NSSubstitute集合返回值与通用存储库
我有一个MongoDB的通用存储库 这是我的获取方法: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
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的
代码>?是的,我已经包括在内了。:)