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

如何对这种C#扩展方法进行单元测试?,c#,unit-testing,C#,Unit Testing,我只是不知道如何模拟一种情况来测试这一点。我应该在文件系统上创建一个文件吗 public static void DeleteIfExists(this FileInfo fileInfo) { if (fileInfo.Exists) { fileInfo.Delete(); } } 我会使用模拟框架,比如 [测试] public void应删除文件whenitexists() { var mockInfo=MockRepository.GenerateMock

我只是不知道如何模拟一种情况来测试这一点。我应该在文件系统上创建一个文件吗

public static void DeleteIfExists(this FileInfo fileInfo)
{
   if (fileInfo.Exists)
   {
      fileInfo.Delete();
   }
}

我会使用模拟框架,比如

[测试]
public void应删除文件whenitexists()
{
var mockInfo=MockRepository.GenerateMock();
Expect(i=>i.Exists)。Return(true)。Repeat.Once();
Expect(i=>i.Delete()).Repeat.Once();
var extensions=newfileinfoextensions();
extensions.DeleteIfExists(mockInfo);
mockInfo.verifyallexpections();
}
[测试]
public void不应删除文件when note notexist()
{
var mockInfo=MockRepository.GenerateMock();
Expect(i=>i.Exists).Return(false).Repeat.Once();
Expect(i=>i.Delete()).Repeat.Never();
var extensions=newfileinfoextensions();
extensions.DeleteIfExists(mockInfo);
mockInfo.verifyallexpections();
}

关于何时删除引发异常等的其他测试。

如果有人更改实现并破坏它,则可能会失败。:-)我会创建一个文件。就像我测试db时一样,我首先插入一条新记录,这样我就有了一个假人来测试delete方法…@BrunoLM-为什么你要这样做而不是使用rhinomock?这是一个尝试编写单元测试的例子,而它实际上是一个集成测试吗?摆脱扩展方法,只需调用FileInfo.delete。如果文件不存在,FileInfo.Delete将不执行任何操作。看到了吗?虽然这样做有效,但它暴露了被测试方法的内部逻辑:与外部世界的契约是“删除一个文件,如果它存在的话”,但我们不受如何实现这一点的约束。。。。如果实现调用Exists()两次呢?这些测试强制方法以某种方式实现,这在我看来是错误的……我的观点是,这些测试强制执行特定的实现。测试
Delete
成员是否被调用感觉是错误的。如果更改方法以获取文件的完整路径,然后只调用
file.Delete(path)
,该怎么办?当然,这是一个正确的实现…@tvanfosson:我认为这是对测试的滥用。测试不应该依赖于特定的内部实现。@Mitch-这是一种扩展方法!我们并不是要发明一种新的删除文件的方法,而是要减少一点代码复制,以便在使用我们要扩展的类的对象删除文件之前检查文件是否存在。在本例中,我们关心的是方法的特定调用,而不是文件是否实际被删除。我们相信我们正在扩展的类是有效的。
[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();
}