[英]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.