简体   繁体   English

Biztalk映射单元测试异常

[英]Biztalk Map Unit Testing Exception

I am trying to unit test a map with following code, 我正在尝试使用以下代码对地图进行单元测试,

protected string Map(TransformBase map, string xml)
        {
            StringWriter str = new StringWriter();
            XmlTextWriter writer = new XmlTextWriter(str);

            map.Transform.Transform(new XPathDocument(new StringReader(xml)), new XsltArgumentList(), writer);

            return str.ToString();
        }

And it's invoked as follows, 它的调用方式如下:

[Test]
        public void Map_Test()
        {
            var result = Map(new TestMap(),File.ReadAllText(_dataDir.GetFiles("TestRequest.xml")[0].FullName));
            Assert.IsTrue(result.Contains("4323432"));
        }

This works fine for most of the maps, however if I uses a function from an external assembly, this does not works and fails with the error 这对于大多数地图都可以正常工作,但是,如果我使用外部程序集中的函数,则此方法将不起作用,并会因错误而失败

Result Message: System.Xml.Xsl.XslTransformException : Cannot find a script or an extension object associated with namespace 'http://schemas.microsoft.com/BizTalk/2003/ScriptNS0'.

Result StackTrace:  
at System.Xml.Xsl.Runtime.XmlQueryContext.InvokeXsltLateBoundFunction(String name, String namespaceUri, IList`1[] args)
at <xsl:template match="/workOrderRequest">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current)
at <xsl:template match="/">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current)
at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at Execute(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer)
at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, XmlWriter results)

It is not possible to debug custom xslt with reference to external assembly. 无法参考外部程序集调试自定义xslt。

Check this thread for more information 检查线程以获取更多信息

Edit : this might also interest you. 编辑: 也可能使您感兴趣。

Finally, I have managed to do this with following code (BT 2013 R2), The method Map do the actual mapping and returns the result xml, 最后,我设法通过以下代码(BT 2013 R2)做到了这一点, Map方法执行了实际的映射并返回了结果xml,

Parameters, 参数,

map -> new object of the map type instance
xml -> source xml content
extObjects -> *_extxml.xml file content generated when executing validate instance on the map

Code

        protected string Map(TransformBase map, string xml, string extObjects = null)
        {
            string result = string.Empty;
            XslCompiledTransform transform = new XslCompiledTransform();
            XsltSettings setting = new XsltSettings(false, true);
            transform.Load(XmlReader.Create(new StringReader(map.XmlContent)), setting, new XmlUrlResolver());

            using (StringWriter writer = new StringWriter())
            {
                transform.Transform(XmlReader.Create(new StringReader(xml)),
                GetExtensionObjects(extObjects), XmlWriter.Create(writer));
                result = writer.ToString();
            }

            return result;
        }

        protected XsltArgumentList GetExtensionObjects(string extObjects)
        {
            XsltArgumentList arguments = new XsltArgumentList();
            if (extObjects == null)
                return arguments;

            XDocument extObjectsXDoc = XDocument.Parse(extObjects);
            foreach (XElement node in extObjectsXDoc.Descendants("ExtensionObject"))
            {
                string assembly_qualified_name = String.Format("{0}, {1}", node.Attribute("ClassName").Value, node.Attribute("AssemblyName").Value);
                object extension_object = Activator.CreateInstance(Type.GetType(assembly_qualified_name));
                arguments.AddExtensionObject(node.Attribute("Namespace").Value, extension_object);
            }
            return arguments;
        }

Sample usage 样品用法

    [Test]
    public void Map_Test()
    {
        var result = Map(new A_To_B()
            , File.ReadAllText("A.xml")
            , File.ReadAllText("A_To_B_extxml.xml"));
        Assert.IsNotNullOrEmpty(result);
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM