私はこれを再び取り上げることを嫌いますが、私は自分のテストで何かを保護する方法を本当に理解しようとしています。
実際に何らかのアクションを実行する別のメソッドを呼び出す前に、プライベートメソッドを呼び出すパブリックメソッド(以下)があります。壊滅的な可能性があるため、プライベートメソッドの呼び出しが削除されないようにしたいと思います。私はここ、ここ、そしてここでいくつかの調査を行いました、そしてそれらはすべて私的な方法をテストしないと言います。私はそれを理解できると思いますが、このコード行の削除を防ぐにはどうすればよいですか?
ご覧のとおり、パブリックメソッドはvoidを返すため、パブリックメソッド呼び出しの結果をテストすることはできません。そして、直接テストする単体テストがありApplicationShouldBeInstalled()
ます。
public void InstallApplications()
{
foreach (App app in this._apps)
{
// This is the line of code that can't be removed. How can I make
// sure it doesn't get removed?
if (!ApplicationShouldBeInstalled(app)) { continue; }
// This simply can't run unless it passes the above call.
CommonUtility.Container.Resolve<IAppInstaller>().InstallApplication(this, app);
}
}
編集-私はJerKimballの答えに基づいてこれを使いました。
基本的に、私は(Moqからの)Mockオブジェクトを使用し、そのメソッドが予想される回数呼び出されたことを確認します。
[TestMethod()]
public void ApplicationShouldBeInstalledTest_UseCase13()
{
var mockAppInstaller = new Mock<IAppInstaller>();
mockAppInstaller.Setup(m => m.InstallApplication(It.IsAny<ApplicationServer>(),
It.IsAny<Application>()));
CommonUtility.Container.RegisterInstance<IAppInstaller>(mockAppInstaller.Object);
// Actual test code here
appServer.InstallApplications();
mockAppInstaller.Verify(x => x.InstallApplication(It.IsAny<ApplicationServer>(),
It.IsAny<Application>()), Times.Never());
}
これを手放すことはできません。その編集はただ醜いです。実際のモッククラスを作成する必要がありますが、このアプローチははるかにクリーンです。
モック実装:
public class MockAppInstaller : IAppInstaller
{
public bool Invoked { get; set; }
public void InstallApplication(ApplicationServer server, Application app)
{
this.Invoked = true;
}
}
試験方法:
[TestMethod()]
public void ApplicationShouldBeInstalledTest_UseCase14()
{
MockAppInstaller mockAppInstaller = new MockAppInstaller();
CommonUtility.Container.RegisterInstance<IAppInstaller>(mockAppInstaller);
// Actual test code here
appServer.InstallApplications();
Assert.AreEqual(true, mockAppInstaller.Invoked);
}