使用Rhino Mock帮助进行单元测试

4
如何使用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

我能看到的一个问题是,流参数没有通过接口进行抽象化。

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

更多细节请参见:Rhino Mocks Partial Mocks


你知道在哪里可以找到关于使用最新框架的Rhino Mocks的好文章吗? - user686732
@user686732:不幸的是,只有纯在线的犀牛WIKI...和像SO这样的公司内部网络论坛;) - sll

1
我不会使用Rhino Mocks来对那个类进行单元测试。只需创建一个新的测试,向该方法发送一些硬编码的XML和MemoryStream即可。在调用Transform方法后,您可以断言写入MemoryStream的数据。
也许您可以解释一下为什么要使用Rhino Mocks来测试该方法?

我们到处都在使用Rhino Mocks,所以只是想保持一致。 - user686732
1
我不建议您使用其他类型的技术来编写测试。我通常不会模拟对.NET类型的引用,除非它们访问磁盘、网络、数据库或其他不适用于单元测试的内容。但这可能是口味问题 :)祝您的测试好运。 - ThomasArdal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接