用.net测试文件方法的正确方法

时间:2020-06-22 18:20:16

标签: c# .net testing nunit

我是.net和测试的新手。我的以下代码如下:

using System.Xml.Linq;
    public class AnimalXmlService
    {
        public Animal GetAnimalInfoFromXml(string url) {
            XElement xml_doc = GetXmlInfo(url);
            if (xml_doc == null)
            {
                return null;
            } else { 
                XElement animal_info = xml_doc.Element("Animal");
                string animal_name = GetAnimalName(animal_info);
                int animal_id = GetAnimalId(animal_info);

                return new Animal(animal_id, animal_name);
            }
        }

        private XElement GetXmlInfo(string url)
        {
            try
            {
                XElement animal_xml_info = XElement.Load(url);
                return animal_xml_info;
            }
            catch
            {
                return null;
            }
        }


        private int GetAnimalName(XElement animal_info)
        {
           ....
        }

} 

我的问题是如何对GetAnimalInfoFromXml进行存根以返回文件?我有将要使用的示例XML文件,而不是发出请求。这是我的以下测试。我也想知道是否有更好的方法来重构它

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NUnit.Framework;

namespace AnimalXmlService
{
    [TestFixture]
    public class AnimalXmlTest
    {

        [Test]
        public void extracts_valid_name()
        {
           //get xml file?

            animalService AnimalXmlService = new AnimalXmlService();
            name = animalService.GetAnimalName(xml_file);
            Assert.AreEqual(name, "bobby the tiger");
        }

        [Test]
        public void extracts_valid_id()
        {
           //get xml file?
           xml_file = fetch_file //is this appropriate?

            animalService AnimalXmlService = new AnimalXmlService();
            id = animalService.GetAnimalId(xml_file);
            Assert.AreEqual(name, "2");
        }
    }
}

2 个答案:

答案 0 :(得分:3)

在这种情况下,您可以使用测试双打。 首先,您应该使代码更具可测试性(打破依赖关系)

public class AnimalXmlService
{
    private readonly IXmlReader _xmlReader;

    public AnimalXmlService(IXmlReader xmlReader)
    {
        this._xmlReader = xmlReader;
    }

    public Animal GetAnimalInfoFromXml(string url)
    {
        XElement xml_doc = _xmlReader.Load(url);
        if (xml_doc == null)
        {
            return null;
        }
        else
        {
            XElement animal_info = xml_doc.Element("Animal");
            string animal_name = GetAnimalName(animal_info);
            int animal_id = GetAnimalId(animal_info);

            return new Animal(animal_id, animal_name);
        }
    }
}

然后您应该创建一个存根来替换您的实际依赖关系。 (您也可以使用NSubstitute,Mock等框架)

public class XmlReaderStub : IXmlReader
{
    public XElement XElement { get; set; }

    public XElement Load(string url)
    {
        return XElement;
    }
}

最后

public class AnimalXmlTest
{
        [Test]
        public void extracts_valid_name()
        {
            var stub = new XmlReaderStub();
            stub.XElement = new XElement(); // some XElement
            animalService AnimalXmlService = new AnimalXmlService(stub);

            name = animalService.GetAnimalName();

            Assert.AreEqual(name, "bobby the tiger");
        }
}

答案 1 :(得分:0)

您可以在类中使用另一个方法,例如下面的方法,该方法返回XmlDocument。

 public XmlDocument GetXmlFile()
   {      
      XmlDocument doc = new XmlDocument();
      doc.LoadXml("<Animal><Name>Bobby the tiger</Name></Animal>");

      return doc;
   }
相关问题