簡體   English   中英

C#Directory.GetCurrentDirectory()返回帶有NUnit的system32

[英]C# Directory.GetCurrentDirectory() returning system32 with NUnit

我正在使用第3方nuget程序包進行偽裝。 我無法獲得與此庫有關的任何代碼。 我查看了代碼,發現以下代碼行

DownloadsFolder = Path.Combine(Directory.GetCurrentDirectory(), ".local-chromium");

問題是,當我運行單元測試Directory.GetCurrentDirectory()返回Windows/system32 ,代碼失敗,因為它沒有寫此目錄的權限。

看來這是預期的行為https://github.com/nunit/nunit/issues/1768 這里的問題是我無法修改此dll的源代碼,因此被卡住了。 有什么方法可以修改nunit,以便它返回我可以為Directory.GetCurrentDirectory()定義的Directory.GetCurrentDirectory()

如果我理解正確,則調用Directory.GetCurrentDirectory的代碼在您正在測試的應用程序使用的庫中。 (如果是在您自己的NUnit測試中,則答案必須有所不同。)對於庫代碼,這是一個錯誤的設計選擇,因為它假定調用該庫的應用程序已將當前目錄設置(或保留)到該目錄。適當的位置。 (IMO,應用程序可以執行此操作,但庫不是可以的。)

我猜您正在Visual Studio下運行,因為當前目錄最終是System32。

根據設計,NUnit本身永遠不會更改當前目錄,因此它會像程序第一次運行時一樣保留。 您可以在測試中更改它,但是這樣做存在風險。

那解釋了為什么您看到問題。 這是一種解決方法。

  1. 如果您不關心(出於測試目的)文件夾的位置,請在測試設置中創建一個臨時文件夾,然后將其刪除。 您可以對每個測試(SetUp和TearDown)或整個夾具(OneTimeSetUp和OneTimeTearDown)執行此操作。

  2. 在同一安裝位置中,將當前目錄設置為該臨時文件夾,並保存原始當前目錄。 用適當的拆卸方法將其還原。

  3. 確保使用該目錄的任何測試都不能並行運行。 如果根本不使用ParallelizableAttribute ,則應該沒問題。 但是,如果您已在程序集或其他更高級別[NonParallelizable]其設置為某個值,請將包含這些測試的類標記為[NonParallelizable]

最后一步非常重要。 當前目錄是為整個過程設置的,因此它將影響所有正在執行的測試。 重要的是,在更改的目錄生效時,不要再運行其他測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM