听起来您正在尝试使用一种测试方法运行两个测试 - 也许将测试分成两个更好?
如果方法被传递为 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
类型对象的对象,然后工厂本身就被模拟了。
如果您不想更改方法的签名,请在类的构造函数中创建工厂,并通过类的公共属性使其可访问。然后它可以在模拟工厂的测试中被覆盖。这称为依赖注入。