簡體   English   中英

使用 EPPlus 的單元測試類

[英]Unit testing classes that use EPPlus

我在使用 EPPlus 的單元測試類時遇到問題。 在我看來,我有兩個選擇。

我可以模擬並注入 HttpPostedFileBase 到一個方法中,或者我可以模擬並注入 EPPlus ExcelPackage 類。

模擬 HttpPostedFileBase,至少做一個真正的模擬,似乎是有限的。 我可以模擬文件的基本屬性(MIME 類型、文件名等),但是以允許測試實際與其交互的方式模擬其 InputStream 似乎非常困難。 我能想到的唯一解決方案是提供一個真正的 excel 文件,用它創建一個真正的 FileStream,然后將該 FileStream 分配給我的模擬 HttpPostedFileBase 的 InputStream。 但從技術上講,它是集成測試,而不是單元測試。

const string FakeFileName = "TestExcelFile.xlsx"; // path to an actual excel file
var fileStream = new FileStream(FilePath, FileMode.Open);
var fakeFile = A.Fake<HttpPostedFileBase>();
A.CallTo(() => fakeFile.InputStream).Returns(fileStream);



我想如果我想做一個實際的單元測試,我可以模擬並注入 EPPlus ExcelPackage 類。 然后我可以模擬相關的工作表、列和單元格類,動態設置它們的屬性以適應我的測試條件,同時從不接觸真實文件。 問題是,大多數 EPPlus 類都是密封的,所以我不能用 FakeItEasy 來模擬它們。 我嘗試為它們創建包裝類(見下文),所以我可以模擬包裝類……但是我需要模擬/包裝的一些類有內部構造函數,所以我無法實例化它們。 (我確實嘗試使用一些丑陋的技巧來解決內部構造函數問題,但沒有成功。)所以我用這個選項碰壁了。

我還是個新手,還有很多東西要學。 也許我的包裝類概念是不正確的,我做錯了。 有沒有辦法解決這個我看不到的問題,或者我應該放棄,使用真正的 excel 文件,並將其稱為集成測試? 到目前為止,這就是我所傾向於的。

public class ExcelWorksheetsWrapper : IEnumerable<ExcelWorksheet>
{
    public readonly ExcelWorksheets _excelWorksheets;

    public ExcelWorksheetsWrapper()
    {
        // internal constructor, can't instantiate
        _excelWorksheets = new ExcelWorksheets();       
    }

    public ExcelWorksheet Add(string worksheetName)
    {
        return _excelWorksheets.Add(worksheetName);
    }

    public IEnumerator<ExcelWorksheet> GetEnumerator()
    {
        return _excelWorksheets.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _excelWorksheets.GetEnumerator();
    }
}

模擬第三方庫通常是一件令人頭疼的事情,並且會創建神秘的單元測試。

每個測試都應該簡短,易於閱讀和理解。 查看測試應該很容易理解預期的成功操作應該是什么。

通常最好圍繞第三方庫創建包裝類,並在這些類上使用接口。 然后,您可以創建實現這些接口的模擬對象,僅用於測試。

盡管如此,說起來容易做起來難。 顯然,第三方庫會做一些事情,這些事情不能只是剪掉代碼並進行有意義的測試。

在這些情況下,您仍然應該使用自己的接口,但將這些類型的單元測試隔離到依賴第三方庫的最低限度。

嘗試查看 SOLID 編程模式。 使用該模式構建的系統通常更容易測試,因為一切都是松散耦合的。

http://en.wikipedia.org/wiki/Solid_(面向對象設計)

暫無
暫無

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

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