سؤال

لقد قمت بإنشاء اختبار وحدة لطريقة مشروعي.تثير هذه الطريقة استثناءً عند عدم العثور على ملف.لقد كتبت اختبار وحدة لذلك، ولكن ما زلت غير قادر على اجتياز الاختبار عند ظهور الاستثناء.

الطريقة هي

public string[] GetBuildMachineNames(string path)
{
    string[] machineNames = null;

    XDocument doc = XDocument.Load(path);

    foreach (XElement child in doc.Root.Elements("buildMachines"))
    {
        int i = 0;
        XAttribute attribute = child.Attribute("machine");
        machineNames[i] = attribute.Value;
    }
    return machineNames;
}

اختبار الوحدة

[TestMethod]
[DeploymentItem("TestData\\BuildMachineNoNames.xml")]
[ExpectedException(typeof(FileNotFoundException),"Raise exception when file not found")]
public void VerifyBuildMachineNamesIfFileNotPresent()
{
    var configReaderNoFile = new ConfigReader();
    var names = configReaderNoFile.GetBuildMachineNames("BuildMachineNoNames.xml");
}

هل يجب أن أتعامل مع الاستثناء في الطريقة أم أنني أفتقد شيئًا آخر؟؟

يحرر:

المسار الذي أمر به ليس هو المسار الذي يمكن من خلاله العثور على الملف، لذا يجب أن ينجح هذا الاختبار...أي.ماذا لو كان الملف غير موجود في هذا المسار.

هل كانت مفيدة؟

المحلول

في اختبار وحدتك يبدو أنك تقوم بنشر ملف xml: TestData\BuildMachineNoNames.xml الذي تمر به إلى GetBuildMachineNames.إذن الملف موجود ولا يمكنك توقع ملف FileNotFoundException ليتم رميها.لذلك ربما مثل هذا:

[TestMethod]
[ExpectedException(typeof(FileNotFoundException), "Raise exception when file not found")]
public void VerifyBuildMachineNamesIfFileNotPresent()
{
    var configReaderNoFile = new ConfigReader();
    var names = configReaderNoFile.GetBuildMachineNames("unexistent.xml");
}

نصائح أخرى

من خلال وضع [ExpectedException (typeof (FileNotFoundException) ، "رفع الاستثناء عند عدم العثور على الملف")] ، فإنك تتوقع أن تقوم هذه الطريقة بإلقاء FileNotFoundException ، إذا لم يتم طرح FileNotFoundException الاختبار.وإلا فإن الاختبار سيكون ناجحًا.

لم أفهم حقًا مغزى الكود البرمجي العام.يجب أن تكون قادرًا على اكتشاف الاستثناء في التعليمات البرمجية بدلاً من السمات.إنها ممارسة أفضل وتتيح لك أيضًا القيام بأشياء بعد رفعها (على سبيل المثال ، المزيد من عمليات التحقق من الصحة) ... كما أنها تتيح لك إيقاف الكود في مصحح الأخطاء والتحقق من الأشياء بدلاً من الحاجة إلى السؤال في المنتديات.:)

كنت سأستخدم Assert.Throws (رمز TestDelegate) ؛.
راجع هنا مثال .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top