簡體   English   中英

如何對需要特定文件的類進行單元測試

[英]How to unit-test a class which needs a specific file to be present

我目前正在努力學習正確的單元測試。 所以現在我正在嘗試為一個類編寫單元測試,該類應該將XML-File中的數據映射到正確的對象。 當然,該類的所有功能都取決於相應XML文件的存在。 XML文件加載在類的構造函數中。

我正在使用C#和NUnit。 到目前為止,我有兩個測試:

[Test]
public void ShouldAllowInstanceToBeCreatedWhenXMLFileIsPresent()
{
    if (File.Exists(SettingsReader.XML_SETTINGS_PATH))
    {
        SettingsReader settingsReader = new SettingsReader();
        Assert.AreNotEqual(null, settingsReader);
    }
}

[Test]
[ExpectedException("Telekanzlei.Clientmanager.XMLDataLayer.XMLFileNotFoundException")]
public void ShouldThrowExceptionWhenXMLFileIsNotPresent()
{
    if (!File.Exists(SettingsReader.XML_SETTINGS_PATH))
    {
        SettingsReader settingsReader = new SettingsReader();
    }
        else
            throw new XMLFileNotFoundException();
    }

我不確定在測試中檢查文件是否存在是正確的方法,所以對這些測試的任何建議也是受歡迎的。 但我的問題是,如何進行以下測試。 如果XML文件不存在,顯然所有后續測試都將失敗。

那么我是否認為XML文件存在,同時請記住,失敗的測試只是意味着它不是? 這對我來說似乎不對。

是否有一般模式來處理這樣的問題?

感謝任何幫助

編輯:重寫第二個測試,因為如果文件實際存在則失敗...

edit2:可能有助於告訴你,SettingsReader實際上做了什么。 到目前為止它看起來像這樣:

public class SettingsReader
{
    public static readonly string XML_SETTINGS_PATH = "C:\\Telekanzlei\\Clientmanager_2.0\\Settings.xml";

    public XElement RootXElement { get; private set; }

    public SettingsReader()
    {
        if (!File.Exists(XML_SETTINGS_PATH))
            throw new XMLFileNotFoundException();
        using (var fs = File.OpenRead(XML_SETTINGS_PATH))
        {
            RootXElement = XElement.Load(fs);
        }
    }


}

我不確定,但我想StreamReader不會是去這里的方式,不是嗎?

問題不在於您的單元測試,而在於類的設計。 我建議重構該類,以便它不會打開文件,而是在流上運行。 然后你的單元測試可以簡單地替換內存流的文件流 - 簡單! :)

public class SettingsReader()
{
    public SettingsReader(System.IO.StreamReader reader)
    {
        // read contents of stream...
    }
}

// In production code:
new SettingsReader(new StreamReader(File.Open("settings.xml")));

// In unit test:
new SettingsReader(new StringReader("<settings>dummy settings</settings>"));

請記住,打開文件和解析設置數據是兩個非常不同的問題。

如果您必須建議您使用SetUp方法復制或驗證該文件是否存在。 我建議通過將文件添加到測試項目並將其標記為“始終復制”來確保文件存在,一旦您完成工作,就無需重新檢查它。
如果你有很多需要外部文件的測試,你應該使用MsTest - 它有一個名為DeploymentItem的屬性,它確保將文件復制到與測試相同的位置。

考慮重寫代碼,以便可以傳入依賴關系,或以其他方式存儲您想要進行單元測試的代碼。

即將“IMySettingsFileProvider”實例傳遞給SettingsReader構造函數,其中IMySettingsFileProvider.SettingsXml返回一些設置流。 這樣,您可以模擬IMySettingsFileProvider接口進行測試,而不是要求文件存在於磁盤上。

一種選擇是將它放在測試夾具的頂部。 然后測試僅在文件存在時才有效。

[SetUp]
public void Setup()
{
    Assume.That(File.Exists(SettingsReader.XML_SETTINGS_PATH));
}

暫無
暫無

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

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