2011-09-06 64 views
4

我如何用单位犀牛制品帮助做用犀牛模拟

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)); 
      } 
     } 
    } 

回答

1

我不会用犀牛制品进行单元测试类测试下面的类单元测试。只需创建一个新的测试,并将一些硬编码的xml发送到方法和MemoryStream。调用Transform方法后,您可以对写入MemoryStream的数据进行断言。

也许你可以解释为什么你想用Rhino Mocks来测试该方法?

+0

好吧,我们wehere使用犀牛制品随处可见这就是为什么只想成为洽 – user686732

+1

我不建议你使用其他一些技术来编写你的测试。我通常不会嘲笑对.NET类型的引用,除非他们访问光盘,网络,数据库或其他不适用于单元测试的内容。但它可能是一个味道:)与您的测试祝你好运。 – ThomasArdal

1

的一个问题,我可以看到的是,流paremeters不由接口

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

+0

你知道在哪里可以找到使用最新框架的Rhino Mocks的优秀articals吗? – user686732

+0

@ user686732:不幸的是,只有纯粹的在线Rhino WIKI ..​​....和像SO这样的intrawebs论坛;) – sll