2016-11-09 100 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