私はMoqフレームワークを使って単体テストをセットアップしています。私は削除がdisposeメソッドで呼び出される基本クラスを実装呼ばれるユニット・テスト・モッキング・フレームワークは、プログラミングの方法であなたを強制しますか?
public interface ISourceFileLocation : IFileLocation, IDisposable
{
bool RemoveAfterTransfer { get; set; }
void RemoveSource();
//.....
}
RemoveSource-法を確保するために:
私はそうのようなクラスを記述するインタフェースを有しています。
public abstract class SourceFileBase : ISourceFileLocation
{
//......
public bool RemoveAfterTransfer { get; set; }
public void RemoveSource()
{
if (File.Exists(Uri.AbsolutePath))
{
File.Delete(Uri.AbsolutePath);
}
}
public void Dispose()
{
if (this.RemoveAfterTransfer)
this.RemoveSource();
}
}
テストのために、私は具体的なクラスから継承する必要がある基底クラスでのテストを実施したいので、デフォルトの実装は、ありませんISourceFileLocationをあざけります。
私のテストでは、RemoveSource-Methodがバーチャルで、メソッドが呼び出されることを保証するという私の考えを破ると予想しています。
これはフレームワークの欠如ですか、これをテストする優れたフレームワークや方法があるのでしょうか、これは私のコードに問題があり、私のデザインを再考すべきでしょうか?
種類について
testmethods:
[TestCategory("Source")]
[TestMethod]
public void CheckIfRemoveSourceMethodIsCalled()
{
//ARRANGE
var mockSourceLocation = new Mock<SourceFileBase>();
mockSourceLocation.Object.RemoveAfterTransfer = true;
mockSourceLocation.Setup(x => x.RemoveSource());
//ACT
mockSourceLocation.Object.Dispose();
/ASSERT
mockSourceLocation.VerifyAll();
}
[TestCategory("Source")]
[TestMethod]
public void CheckIfRemoveSourceMethodIsNotCalled()
{
//ARRANGE
var mockSourceLocation = new Mock<SourceFileBase>();
mockSourceLocation.Object.RemoveAfterTransfer = false;
//ACT
mockSourceLocation.Object.Dispose();
//ASSERT
mockSourceLocation.Verify(x=>x.RemoveSource(), Times.Never);
}