避免处理底层流

时间:2010-04-12 09:02:26

标签: .net file mocking

我正在尝试模拟一些文件操作。在我的“真实”对象中:

StreamWriter createFile( string name )
{
  return new StreamWriter( Path.Combine( _outFolder, name ), false, Encoding.UTF8 ) );
}

在模拟对象中,我喜欢

StreamWriter createFile( string name )
{
  var ms = new MemoryStream();
  _files.Add( Path.Combine( _outFolder, name ), ms );
  return new StreamWriter( ms, Encoding.UTF8 ) );
}

其中_files是一个字典,用于存储创建的文件以供日后检查。

但是,当消费者关闭StreamWriter时,它处理MeamoryStream ...: - (

关于如何追求这一点的任何想法?

2 个答案:

答案 0 :(得分:6)

如果你继承MemoryStream,这将有效,但你必须调用ManualDispose方法来关闭底层流。
我不确定,但我认为这个对象在超出范围时会被垃圾收集。

public sealed class ManualMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
    }
    public void ManualDispose()
    {
        base.Dispose(true);
    }
}

修改:
如果您希望刷新MemoryStream并准备从顶部读取,则可以使用此选项。

public sealed class ManualMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
        Flush();
        Seek(0, SeekOrigin.Begin);
    }
    public void ManualDispose()
    {
        base.Dispose(true);
    }
}

答案 1 :(得分:3)

StreamWriter的本质是在它自身处理时处理底层流。但是,通过创建(并返回)StreamWriter的子类(我将其称为LeakyStreamWriter),您应该能够阻止此默认行为。

public class LeakyStreamWriter : StreamWriter
{
    public override void Close()
    {
        BaseStream.Close(); //close, but do not dispose
    }

    protected override void Dispose(bool disposing)
    {
        //do nothing here
    }
}

请注意,我假设StreamWriter除了底层流之外没有其他组件可供处置,您可能需要检查StreamWriter的反汇编以检查这两种方法实际执行的操作。

无论如何,使用上面的子类的结果是,当关闭一个源代码时,底层流将被关闭,但不会被丢弃。