1つのテスト方法で2つのテストを実行しようとしているようですが、テストを2つに分割したほうがよいでしょうか。
また、メソッドにnullが渡された場合は、新しいオブジェクトを初期化する必要があります。これをテストするには、のインスタンスの作成を担当するファクトリオブジェクトを作成することをお勧めしますMyClass
。新しいコードは次のようになります。
interface IMyClassFactory
{
IMyClass CreateMyClass();
}
bool Method(IMyClass myObj, IMyClassFactory myClassFactory)
{
if (myObj != null)
{
return true;
}
myObj = myClassFactory.CreateMyClass();
return myObj.SomeFunctionReturningBool();
}
その場合、テストは次のようになります。
[Test]
public void Method_ShouldReturnTrueIfNotPassedNull()
{
Assert.That(target.Method(new MyClass()), Is.True);
}
[Test]
public void Method_ShouldCreateObjectAndReturnResultOfSomeFunctionIfPassedNull()
{
// Arrange
bool expectedResult = false;
var mockMyClass = new Mock<IMyClass>();
mockMyClass.Setup(x => x.SomeFunctionReturningBool()).Returns(expectedResult);
var mockMyFactory = new Mock<IMyClassFactory>();
mockMyFactory.Setup(x => x.CreateMyClass()).Returns(mockMyClass.Object);
// Act
var result = target.Method(null, mockMyFactory.Object);
// Assert
mockMyClass.Verify(x => x.SomeFunctionReturningBool(), Times.Once());
mockMyFactory.Verify(x => x.CreateMyClass(), Times.Once());
Assert.That(result, Is.EqualTo(expectedResult));
}
ここでは、ファクトリパターンを使用して、タイプのオブジェクトを作成できるオブジェクトを渡しIMyClass
、ファクトリ自体をモックしました。
メソッドのシグネチャを変更したくない場合は、クラスのコンストラクターにファクトリを作成し、クラスのパブリックプロパティを介してアクセスできるようにします。その後、模擬工場によるテストで上書きできます。これは依存性注入と呼ばれます。