访问 moq 对象时如何返回 null?

2024-05-21

我正在使用 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(使用前将#替换为@)

访问 moq 对象时如何返回 null? 的相关文章

随机推荐