我有一个MongoDB的通用存储库。
这是我的Get方法:
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;
}
当我试图模仿它时,我收到一个错误:
IList<Login>
(其中Login是我的业务对象)不包含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);
}
有关如何模拟它的任何建议,以便我可以在单元测试中设置我想要的返回值吗?
答案 0 :(得分:1)
解决了它。
List<Login> loginList = new List<Login>()
{
};
_mongoDAL.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>()).Returns(loginList);
不知道为什么只有退货,它才有效。
答案 1 :(得分:0)
问题是由于您将错误的类型传递给ReturnsForAnyArgs
来电。如果您呼叫Returns
或ReturnsForAnyArgs
,则此行为相同。
您的Get
方法定义为返回IList<TEntity>
。在您的初始问题中,您将返回logl
,其类型为Task<IList<Login>>
(请注意Task
包裹您的IList
)。但是,在solution中,您传递loginList
,即List<T>
,它实现IList<T>
,因此您的代码会编译。因此,作为替代方案,您可以使用:
_mongoDAL.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>())
.ReturnsForAnyArgs(loginList);
您最初获得的编译错误有点神秘。完整的错误消息是:
错误CS1928:'System.Collections.Generic.IList'不包含'ReturnsForAnyArgs'的定义和最佳扩展方法重载'NSubstitute.SubstituteExtensions.ReturnsForAnyArgs(System.Threading.Tasks.Task,T,params T [ ])'有一些无效的论点
错误消息的前半部分看起来,就像它指向缺少的扩展方法一样。然而,实际上问题在于它无法与任何重载方法匹配,因此它会选择最接近的方法并向您显示它不匹配的方式。
通常,您会收到第二个错误,表明这是您的问题。像这样:
错误CS1929:实例参数:无法从'System.Collections.Generic.IList'转换为'System.Threading.Tasks.Task&gt;&gt;'