2016-11-09 133 views
1

我想用Moq来测试一些没有成功的异步任务。c#moq测试异步任务

我可以做模拟的东西,但是当我尝试使用mock.Object时,它抛出(Object ='m.Object'抛出了类型为'Castle.DynamicProxy.Generators.GeneratorException'的异常)并且VS停止调试/运行。

这里ID测试的起订量方式:

interface ITestAsync 
     { 
      Task<IEnumerable<string>> get(); 
     } 

     [Fact] 
     public async Task MoqShouldReturnFIRST() 
     { 
      var m = new Mock<ITestAsync>(); 
      m.Setup(q => q.get()).ReturnsAsync(null); 

      var x = await m.Object.get().FirstIfNotNullOrEmptyAsync(); 

      x.Should().BeNull(); 
     } 

下面是使用的xUnit

public class FirstIfNotNullOrEmptyAsyncTests 
    { 

     private async Task<IEnumerable<string>> getAll() 
     { 
      List<string> x = new List<string>(); 
      x.Add("01"); 
      x.Add("02"); 

      await Task.Delay(1000); 

      return x; 
     } 

     private async Task<IEnumerable<string>> getNull() 
     { 
      List<string> x = new List<string>(); 
      x = null; 

      await Task.Delay(1000); 

      return x; 
     } 

     private async Task<IEnumerable<string>> getEmpty() 
     { 
      List<string> x = new List<string>(); 

      await Task.Delay(1000); 

      return x; 
     } 

     [Fact] 
     public async Task ShouldReturnFIRST() 
     { 
      var x = await getAll().FirstIfNotNullOrEmptyAsync(); 

      x.Should().Be("01"); 
     } 

     [Fact] 
     public async Task ShouldReturnNULLforNULL() 
     { 
      var x = await getNull().FirstIfNotNullOrEmptyAsync(); 

      x.Should().BeNull(); 
     } 

     [Fact] 
     public async Task ShouldReturnNULLforEMPTY() 
     { 
      var x = await getEmpty().FirstIfNotNullOrEmptyAsync(); 

      x.Should().BeNull(); 
     } 
    } 

我的,我想测试Extention在传统的方式测试:

public static async Task<T> FirstIfNotNullOrEmptyAsync<T>(this Task<IEnumerable<T>> obj) where T : class 
     { 
      var result = await obj; 

      return (result != null && result.Any()) ? result?.FirstOrDefault() : null; 
     } 
+2

重新测试从实例均通过了所有测试。只有最初的问题是界面是私人的(但猜测这是由于最小的例子)。一旦界面被公开,一切工作/通过 – Nkosi

+0

包括整个异常消息 – Nkosi

回答

1

只有最初的问题是接口是私人的(但猜测这是由于最小的例子)。

得到了以下错误

Castle.DynamicProxy.Generators.GeneratorException:无法 类型创建 代理Moq.IMocked`1 [**** + ITestAsync, ***** ,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]] ,因为类型**** + ITestAsync不是 可访问。将其公开或内部标记为 [assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)] 属性,因为装配Moq是强名。

一旦接口被公之于众一切工作/通过

public interface ITestAsync { 
    Task<IEnumerable<string>> get(); 
} 
+0

这很完美!成功了!另一个问题。运行代码覆盖率,即使这些测试测试了扩展的所有可能性,但它说只覆盖了90%,因为缺少MoveNext()部分的测试。如果所有测试都已经过测试,我该如何测试?什么不见​​了?干杯。 – 2Fast4YouBR

+0

这是我目前关于该主题的知识库之外的内容。搜索后询问社区,看看他们是否可以提供帮助。快乐编码!!!! – Nkosi