gpt4 book ai didi

c# - 访问最小起订量对象时如何返回空值?

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:28 24 4
gpt4 key购买 nike

我正在使用 Moq 库进行单元测试。现在我想要的是,当我第一次访问我的对象时,它应该返回 null,而当我第二次访问它时,它应该返回其他东西。

这是我的代码

var mock = new Mock<IMyClass>();
mock.Setup(?????);
mock.Setup(?????);

var actual = target.Method(mock.object);

在我的方法中,我首先检查模拟对象是否为 null,如果它为 null,则对其进行初始化,然后对其进行一些调用。

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));
}

这里是 factory pattern已用于传入可以创建 IMyClass 类型对象的对象,然后工厂本身已被模拟。

如果您不想更改方法的签名,则在类的构造函数中创建工厂,并使其可通过类的公共(public)属性访问。然后它可以被模拟工厂在测试中覆盖。这叫做 dependency injection .

关于c# - 访问最小起订量对象时如何返回空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11502543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com