TestableIO / System.IO.Abstractions.Extensions

Convenience functionality on top of System.IO.Abstractions
MIT License
20 stars 6 forks source link

Mock XmlReader/StringReader and XslCompiledTransform[.Load] #11

Open rklec opened 2 years ago

rklec commented 2 years ago

Is your feature request related to a problem? Please describe. I want to mock XSL transformation, implemented via XslCompiledTransform.

var xmlTransformer = new XslCompiledTransform();

xmlTransformer.Load(xslPath);
xmlTransformer.Transform(xmlFilePath, null, output);

So there are two use cases:

Describe the solution you'd like Let me mock XslCompiledTransform and read the file mock as usual...

Describe alternatives you've considered The XML can quite easily be read from a stream, however, this needs a mock of XmlReader, which we cannot do with this lib here.

Also loading the XSL from a string requires this or at least both need StringReader and a way more complicated implementation.

All in all the above code can be re-written as such to make it work with the mock, however, this is really complicated/complicates the code just for macking it testable - in contrast to the short and understandable code snippet shown above:

var xmlTransformer = new XslCompiledTransform();

await using var openReadXml = FileSystem.File.OpenRead(xmlFilePath);
await using var openReadXsl = FileSystem.File.OpenRead(xslPath);

var xmlReaderSettings = new XmlReaderSettings
{
    Async = true,
    CloseInput = true
};

using var xmlReader = XmlReader.Create(openReadXml, xmlReaderSettings);
using var xslReader = XmlReader.Create(openReadXsl, xmlReaderSettings);
xmlTransformer.Load(xslReader);
xmlTransformer.Transform(xmlReader, null, output);

xmlReader.Close();
xslReader.Close();

Additional context I am open to any other way for other implementations/changes in how I can mock the XML/XSL transformation/reading properly.


Copied/moved from https://github.com/TestableIO/System.IO.Abstractions/issues/751