gpt4 book ai didi

c# - 如何使用 RhinoMocks 测试带有特定参数的方法调用?

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

我使用 RhinoMocks 进行模拟/ stub ,使用 Nunit 框架进行单元测试。

我有以下类(class)

    class A
{
private int data = -1;

public void Initialize (int data)
{
this.data = data;
}

public void CallA()
{
if (data == -1) throw new InvalidArgumentException("data has invalid value -1");
try
{

A1("a1");
A2("a2");
}
catch (AException e)
{
throw;
}

catch (Exception e)
{
throw new AException(ErrorCode.UnknownException, e);
}
}
private void A1(string item)
{
}

private void A2(string item)
{
}

}

我正在努力跟踪测试用例:

  1. InvalidAgrumentException:如果未调用 Initialized 方法或将 -1 作为参数传递给 Initialized,则会引发此异常。数据是私有(private)的,因此不能被模拟(直到使用诸如 TypeMock isolater 之类的库来执行 IL Weaving )。要引发此异常,一种选择是调用 Initialized 方法,我不确定这是正确的方法吗? (因为数据也可以从其他地方设置为 -1。虽然这不是问题,但需要额外的函数调用。)

  2. 验证A1是用“a1”参数调用的,A2是用“a2”参数调用的。

最佳答案

Daniel 提出了一个很好的观点,我只想稍微扩展一下他的回答。让你的测试依赖于私有(private)方法调用会创建一个非常脆弱的测试套件。私有(private)方法是实现细节,您应该始终根据内部实现的变化安全地更改它们,而不是观察 10-20 次测试失败。

Initilize 方法的另一点 - 如果很难测试,请想象一下使用您的类有多么困难。 Robert Martin 在他的一本书中提出了一个很好的观点,该方法没有说明之前应该调用什么其他方法以及调用顺序。

例如,在您的情况下,public void CallA() 没有说明为什么何时以及使用什么参数调用 Initialize。为什么不使用输入参数从 Initialize 创建构造函数或从构造函数调用 Initialize。现在你确定它已经被调用了。还有一点是关于魔数(Magic Number)-1

很抱歉提出批评,但我曾使用过此类设计,无论您使用什么测试\模拟框架,都很难对其进行测试。你可以模拟 private 方法,你可以 stub 静态方法调用,但这一切都以良好的设计结束,而不是模拟框架的力量。

关于c# - 如何使用 RhinoMocks 测试带有特定参数的方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14357064/

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