Nsubstitute使用Generic Repository设置返回值

时间:2016-02-13 17:35:22

标签: unit-testing generics nsubstitute

我有一个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);
}

有关如何模拟它的任何建议,以便我可以在单元测试中设置我想要的返回值吗?

2 个答案:

答案 0 :(得分:1)

解决了它。

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

     _mongoDAL.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>()).Returns(loginList);

不知道为什么只有退货,它才有效。

答案 1 :(得分:0)

问题是由于您将错误的类型传递给ReturnsForAnyArgs来电。如果您呼叫ReturnsReturnsForAnyArgs,则此行为相同。

您的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;'