2017-02-23 53 views
0

我正在使用Microsoft.VisualStudio.TestTools.UnitTesting進行單元測試。Assert.ThrowsException測試失敗,當它拋出異常時

我有這樣的測試,它斷言拋出了一個異常,它是失敗的

[TestMethod] 
public async Task ShouldThrowHttpExceptionIfPassedObjectIsNull() 
{ 
    _mockLogger = new Mock<ILogger<DataService>>(); 

    // setup memoryCache 
    object expected = null; 
    _mockNullMemoryCache = MockMemoryCacheService.GetNullMemoryCache(expected); 
    _mockSessionManagementService = new MockSessionManagementService(); 

    _ds = new DataService(
     _mockLogger.Object, 
     _mockNullMemoryCache.Object, 
     _mockSessionManagementService 
    ); 
    Assert.ThrowsException<HttpException>(() => _ds.RetrieveFileData<object>(_incorrectFilePath, false)); 
} 

當我調試它,代碼的最後一行之前就出現了錯誤運行,失敗是這樣的:

enter image description here

例外ex是一個system.invalidOperationException但這應該不重要,因爲它拋出一個HttpException無關緊要。爲什麼試驗與失敗的原因:

測試名稱:ShouldThrowHttpExceptionIfPassedObjectIsNull測試 真實姓名:xxx.xxx.xxx.xxx.ShouldThrowHttpExceptionIfPassedObjectIsNull 測試 來源:C:\用戶\ XXX \ xxx.cs :行88測試結果:失敗測試持續時間:0:04:35.5251661

結果堆棧跟蹤:在 xxxxxx.d__10.MoveNext() 在 C:\用戶\ XXX \ XXX \ xxx.cs:線 - - 從以前的位置反射堆棧結束的痕跡n爲拋出---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務 任務)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務 任務)結果消息:Assert.ThrowsException失敗。拋出異常 。預期HttpException異常。

EDIT 該代碼隨後移動到該代碼塊圖像之後:

else 
       { 
        // Parsing issue 
        _logger.LogError(string.Format("Id={0}, Could not retrieve data from {1} : Malformed source data", _sessionManagementService.SessionId, url)); 
        throw new HttpException(HttpStatusCode.InternalServerError, "Malformed source data", true); 
       } 

由於它是扔上述HttpException,它將引發DllNotFoundException。

拋出異常: 'System.DllNotFoundException' 在 System.Private.CoreLib.ni.dll

其他信息:無法加載DLL 'combase.dll':該 指定的模塊無法找到。 (異常來自HRESULT: 0x8007007E)

+0

@ThomasWeller否,但測試正在測試HttpException,這是拋出的。 – BeniaminoBaggins

回答

2

當我看的HttpException的類型層次,我看到它母鹿不從InvalidOperationException異常繼承。因此單元測試失敗。

可能有一些LINQ代碼或其他代碼無法正確執行,因此會捕獲HttpException並將其轉換爲InvalidOperationException。

您應該能夠調試單元測試。指示Visual Studio停止異常,然後逐步前進並嘗試找出異常轉換的位置,例如當你通過一些LINQ代碼。

MoveNext()調用表示某事試圖循環值。調試時,禁用Just my code,因爲它可能在.NET框架中。

+0

但是,當我從上圖中的代碼行一步一步地前進時,它只是在該行代碼後崩潰。 – BeniaminoBaggins

+0

好吧,無視我最後的評論。現在就這樣做。謝謝 – BeniaminoBaggins

+0

您的答案是解決方案。謝謝!。我只是想知道,如果你能指出我對我發現的東西的正確方向(參見我的問題底部的編輯)。這很奇怪,因爲它第一次成功拋出HttpException,儘管它與最後一個參數中的3個參數相比只有2個參數。也許被測試的代碼需要更改? – BeniaminoBaggins