如何对这个C#扩展方法进行单元测试?

Mik*_*ole 3 c# unit-testing

我只是不确定如何模拟情况来测试这个.我应该在文件系统上实际创建文件吗?

public static void DeleteIfExists(this FileInfo fileInfo)
{
   if (fileInfo.Exists)
   {
      fileInfo.Delete();
   }
}
Run Code Online (Sandbox Code Playgroud)

tva*_*son 8

我会使用像RhinoMocks这样的模拟框架.

[Test]
public void ShouldDeleteAFileWhenItExists()
{
    var mockInfo = MockRepository.GenerateMock<FileInfo>();
    mockInfo.Expect( i => i.Exists ).Return( true ).Repeat.Once();
    mockInfo.Expect( i => i.Delete() ).Repeat.Once();

    var extensions = new FileInfoExtensions();

    extensions.DeleteIfExists( mockInfo );

    mockInfo.VerifyAllExpectations();
}

[Test]
public void ShouldNotDeleteAFileWhenItDoesNotExist()
{
    var mockInfo = MockRepository.GenerateMock<FileInfo>();
    mockInfo.Expect( i => i.Exists ).Return( false ).Repeat.Once();
    mockInfo.Expect( i => i.Delete() ).Repeat.Never();

    var extensions = new FileInfoExtensions();

    extensions.DeleteIfExists( mockInfo );

    mockInfo.VerifyAllExpectations();
}
Run Code Online (Sandbox Code Playgroud)

Delete时抛出异常等的其他测试

  • 虽然这有效,但它暴露了被测方法的内部逻辑:与外部世界的契约是"删除文件,如果它存在",但我们不受我们如何实现这一点的约束......如果实现调用该怎么办?存在()两次?那些测试强制说该方法已经以某种方式实现,这对我来说似乎是错误的...... (2认同)
  • @Mitch - 这是一种扩展方法!我们并没有试图发明一种删除文件的新方法,我们试图减少一些代码复制,以便在我们使用类的对象删除文件之前检查文件是否存在延伸.在这种情况下,它**是我们关心的方法的特定调用,而不是文件是否实际被删除.我们相信我们所扩展的课程是有效的. (2认同)