【问题标题】:Nsubstitute set return value with Generic RepositoryNsubstitute 使用通用存储库设置返回值
【发布时间】:2016-02-13 17:35:22
【问题描述】:

我有一个 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&lt;Login&gt;(其中 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);
}

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

【问题讨论】:

  • "...不包含 ReturnsForAnyArgs 的任何定义" -- 这听起来像您缺少 using NSubstitute;?
  • 是的,我把它包括在内。 :)

标签: unit-testing generics nsubstitute


【解决方案1】:

解决了。

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

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

不知道为什么只用 Returns 就可以了。

【讨论】:

    【解决方案2】:

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

    您的Get 方法定义为返回IList&lt;TEntity&gt;。在您最初的问题中,您将返回logl,它的类型为Task&lt;IList&lt;Login&gt;&gt;(注意Task 包装了您的IList)。但是,在您的solution 中,您传递的是loginList,这是一个List&lt;T&gt;,它实现了IList&lt;T&gt;,因此您的代码可以编译。因此,作为替代方案,您可以使用:

    _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>>”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2010-11-02
      • 2018-10-19
      • 2019-11-09
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多