【问题标题】:When unit testing, how do I mock a return null from async method?单元测试时,如何模拟异步方法的返回 null?
【发布时间】:2016-01-26 04:55:29
【问题描述】:

通常,我像这样模拟我的回购:

var repository = new Mock<ISRepository>();
repository.Setup(r => r.GetMemberAsync(email))
    .Returns(Task.FromResult(new Member
    {
        FirstName = firstName,
        LastName = lastName
    }));

但是,在我的代码中,我检查是否找不到该成员,即 GetMemberAsync 返回 null。我如何模拟这个?

我试过了:

var repository = new Mock<ISRepository>();
repository.Setup(r => r.GetMemberAsync(email))
    .Returns(Task.FromResult<object>(null));

但我得到一个编译错误。

【问题讨论】:

    标签: c# unit-testing asp.net-mvc-5 async-await moq


    【解决方案1】:

    您收到编译器错误,因为您返回的任务与异步方法返回的类型不匹配。你应该返回Task&lt;Member&gt; 而不是简单的Task&lt;object&gt;

    repository.Setup(r => r.GetMemberAsync(email)).Returns(Task.FromResult<Member>(null));
    

    【讨论】:

    • 另外,您可以将null 转换为您想要的类型 - Task.FromResult((Member)null)(在FromResult 的情况下并不完全有用,但在类型更复杂时可能会很方便)。
    • 非常感谢,它成功了......repository.Setup(r => r.GetMemberAsync(email)).Returns(Task.FromResult(null));
    【解决方案2】:

    老问题,但你也可以这样做,我认为它更干净:

    假设你的对象的默认值为 null 你也可以使用:

    default(<insert object type here>)
    

    例如

    default(Member)
    default(List<string>)
    etc.
    

    完整示例:

    var myRepo = new Mock<IMyRepo>();
    myRepo 
        .Setup(p => p.GetAsync("name"))
        .ReturnsAsync(default(List<string>));
    

    【讨论】:

      【解决方案3】:

      也可以不使用Task类返回结果。

      repository
          .Setup(r => r.GetMemberAsync(email))
          .ReturnsAsync((Member)null);
      

      【讨论】:

      • 1.使用 Async 并确保 TypeCast NULL;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多