我正在使用 Moq 库进行单元测试。现在我想要的是,当我第一次访问我的对象时,它应该返回 null,当我第二次访问它时,它应该返回其他内容。
这是我的代码
var mock = new Mock<IMyClass>();
mock.Setup(?????);
mock.Setup(?????);
var actual = target.Method(mock.object);
在我的方法中,我首先检查模拟对象是否为空,如果为空,则初始化它,然后对其进行一些调用。
bool Method(IMyClass myObj)
{
if (myObj != null)
return true;
else
{
myObj = new MyClass();
bool result = myObj.SomeFunctionReturningBool();
return result;
}
}
如何设置模拟对象,
我还需要知道如何模拟这一行
bool result = myObj.SomeFunctionReturningBool();
听起来您正在尝试使用一种测试方法运行两个测试 - 也许将测试分成两个会更好?
如果该方法传递 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));
}
这里的工厂模式 http://en.wikipedia.org/wiki/Factory_method_pattern已用于传递一个对象,该对象可以创建以下对象IMyClass
类型,然后工厂本身就被嘲笑了。
如果您不想更改方法的签名,请在类的构造函数中创建工厂,并使其可通过类的公共属性进行访问。然后它可以在测试中被模拟工厂覆盖。这就是所谓的依赖注入 http://en.wikipedia.org/wiki/Dependency_injection.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)