Помогите сделать юнит-тестирование с помощью Rhino Mock - PullRequest
4 голосов
/ 06 сентября 2011

Как мне выполнить модульное тестирование следующего класса, используя Rhino Mocks

public interface IXmlTransformer
{
    void Transform(Stream inputXml, Stream transformedXml);
}

public class XmlToFOTransformer : IXmlTransformer
    {
        private string styleSheetPath = string.Empty;
        private bool fillable = true;

        public XmlToFOTransformer(
                                  string styleSheetUri, 
                                  bool shouldAllowUserToEditData)
        {
            if (string.IsNullOrEmpty(styleSheetUri))
            {
                throw new ArgumentNullException(
                               "styleSheetUri", 
                               "styleSheetUri can not be null");
            }

            styleSheetPath = styleSheetUri;
            fillable = shouldAllowUserToEditData;
        }

        public void Transform(Stream inputXml, Stream transformedXml)
        {
            if (inputXml == null)
            {
                throw new ArgumentNullException(
                                    "inputXml", 
                                    "Input xml can not be null.");
            }

            if (transformedXml == null)
            {
                throw new ArgumentNullExceptio(
                                    "transformedStream", 
                                    "TransformedStream can not be null.");
            }

            XslCompiledTransform transformer = new XslCompiledTransform();

            XsltSettings xsltSettings = new XsltSettings();
            xsltSettings.EnableDocumentFunction = true;

            XmlUrlResolver resolver = new XmlUrlResolver();

            XmlReaderSettings readerSettings = new XmlReaderSettings();
            readerSettings.DtdProcessing = DtdProcessing.Ignore;

            try
            {
                transformer.Load(styleSheetPath, xsltSettings, resolver);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(string.Format(
                        CultureInfo.InvariantCulture, 
                       "Error while loding & compiling the Xsl file, the system returned {0}", 
                        ex.Message));
            }

            XmlReader inputXmlReader;
            try
            {
                inputXmlReader = XmlReader.Create(inputXml, readerSettings);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(string.Format(System.Globalization.CultureInfo.InvariantCulture, "Error loading the XML file, the system returned {0}", ex.Message));
            }

            // do the transform              
            try
            {
                transformer.Transform(
                                   inputXmlReader, 
                                   xsltArguments, 
                                   transformedXml);
                transformedXml.Position = 0;
            }
            catch (Exception ex)
            {
                throw new ApplicationException(string.Format(System.Globalization.CultureInfo.InvariantCulture, "Error in transforming the XML file and XSL file, the system returned {0}", ex.Message));
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Одна проблема, которую я вижу, состоит в том, что параметры потока не абстрагируются интерфейсом

void Transform(Stream inputXml, Stream transformedXml);

Но в любом случае RhinoMocks позволяет имитировать абстрактные классы с помощью функции PartialMock.

Итак, тестируйтезаглушка хотела бы: (псевдокод)

var transformer = new XmlToFOTransformer(
                                   styleSheetUri, 
                                   shouldAllowUserToEditData);

// Arrange
var inputXmlStreamMock = mockRepository.PartialMock<Stream>(ctor args);
var transformedXmlStreamMock = mockRepository.PartialMock<Stream>(ctor args);

// setup expectations
// ...

// Act
transformer.Transform(inputXmlStreamMock, transformedXmlStreamMock );


// Assert
// asserts here

См. для более подробной информации: Неполные Mocks Rhino

1 голос
/ 07 сентября 2011

Я бы не использовал Rhino Mocks для модульного тестирования этого класса.Просто создайте новый тест и отправьте несколько жестко закодированных XML-данных методу и MemoryStream.Вы можете подтвердить данные, записанные в MemoryStream, после вызова метода Transform.

Может быть, вы могли бы объяснить, почему вы хотите использовать Rhino Mocks для тестирования этого метода?

...