gpt4 book ai didi

c# - 有没有更好的方法来测试这种方法?

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:52 25 4
gpt4 key购买 nike

我想对下面的方法运行一些单元测试,我将一个模拟接口(interface) (vehicleObject) 传递给 ProcessVehicles 但是一旦它通过它就会被重新分配通过 DetermineVehicleType 所以我的模拟对象没有用。我的第一个想法是创建一个 bool 值来确定是否应该运行 DetermineVehicleType 并将其添加为参数,但这听起来非常困惑。有没有更好的方法来解决这个问题?

注入(inject) Mock 对象的方法:

public void ProcessVehicles(ICarObject CarObject)
{
IObject vehicleObject = DetermineVehicleType(carObject);
vehicleObject.ProcessVehicle(carObject);
}

原始代码:

public void ProcessVehicles()
{
IObject vehicleObject = DetermineVehicleType(carObject);
vehicleObject.ProcessVehicle(carObject);
}

注意:我无法在调用 DetermineVehicleType 之前检查 vehicleObject 是否为 null,因为在实际使用该类时它可能不是 null。从长远来看,也许完全重构是答案,在这一点上这不是我正在寻找的答案,也许没有其他选择。

DetermineVehicleType 方法是私有(private)的

注意:我知道有代码味道,这是当前有效的遗留代码。我想围绕它进行测试而不是改变它,这样它看起来很漂亮,然后在生产中中断。完全重构可能是唯一的选择,我只是想确保没有其他使用模拟工具的解决方案。

最佳答案

DetermineVehicleType 有什么访问修饰符?您可以将该方法 stub ,以便它返回您的模拟接口(interface)(Roy Osherove 将其称为抽象测试驱动程序模式,我相信)。否则,这看起来像是重构的主要候选者:)

要重构您的代码,您可以这样做

首先,改变你的方法签名

protected virtual IObject DetermineVehicleType(CarObject obj)
{
//Do whatever you normally do
}

然后,在你的测试中,你可以从上面的类中创建一个 stub ,并让它返回你 stub 的 IObject 而不管 CarObject 传入。你可以手动创建一个 stub 类从类继承,或者你可以使用最小起订量之类的东西来完成这个。如果您需要我详细说明这一点,请告诉我。

然而,还有一点要注意:

一个更好的重构方法是简单地将 IObject 传递给 ProcessVehicles,因为从这个例子看来你有一个 SRP这里的违规行为,ProcessVehicles 方法所做的不仅仅是处理它们。但是,也许这只是来自这个简化的例子

完整实现更新

    [Test]
public void TestMethod()
{
var testerStub = new TesterStub();
testerStub.ProcessVehicles();
//Assert something here
}

public class TesterStub : Tester
{
public override IObject DetermineVehicleType(CarObject obj)
{
var mockObject = new Mock<IObject>();
mockObject.Setup(x => x.SomeMethod).Returns(Something);
return mockObject.Object;
}
}

public class Tester
{
protected virtual IObject DetermineVehicleType(CarObject obj)
{
return new ObjectTester();
}

public void ProcessVehicles()
{
var carType = DetermineVehicleType(new CarObject());

}
}

public class ObjectTester : IObject
{
}

public interface IObject
{
}

public class CarObject
{
}

关于c# - 有没有更好的方法来测试这种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811460/

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