gpt4 book ai didi

c# - 重载 protected 通用方法单元测试导致 AmbiguousMatchException

转载 作者:行者123 更新时间:2023-11-30 22:10:40 26 4
gpt4 key购买 nike

我正在尝试在我的代码重载签名中测试(使用 Moq)重载 protected 泛型方法:

protected void AutoMap<FromType, ToType>(IList<FromType> sources
, IList<ToType> destinations)

protected void AutoMap<FromType, ToType>(FromType from
, ToType to)

为了能够访问这些方法中的第二个,我使用了 PrivateObject 然后通过反射调用方法:

a obj_a = new a();
b obj_b = new b();
PrivateObject o = new PrivateObject(controller);
o.Invoke("AutoMap"
, new Type[] { typeof(a), typeof(b) }
, new Object[] { obj_a, obj_b }
, new Type[] { typeof(a), typeof(b) });

当我运行测试时,我得到 System.Reflection.AmbiguousMatchException 说找到了不明确的匹配项。

谁能告诉我如何正确地做到这一点?干杯K.

最佳答案

一般来说,您不应该测试 protected 方法。只应测试公共(public)方法。从单元测试的角度来看, protected 方法应该被视为私有(private)的。

您应该测试您的实现类,看看它是否按预期工作。如果这个类使用 protected /私有(private)方法来完成它的工作——这是实现细节,并且实现可以随时更改而不改变类的行为(想想重构)。

假设您有:

public abstract class Base
{
public virtual int GetResult(int data)
{
var z = GetMoreData();
return data*z;
}
protected int GetMoreData()
{
///something
return something;
}
}

public class MyRealImplementation : Base
{
public override int GetResult(int data)
{
//wahtever
}
}

无法(或没有意义)测试 protected 方法。不知道被覆盖的 GetResult 是否会使用它(可能会,也可能不会)。

唯一要测试的是 GetResult 是否返回预期结果,而不是它是如何返回的。

在特定情况下,最好在接口(interface)后面抽象映射功能,这样您就可以模拟它。

public interface IMapper
{
AutoMap<FromType, ToType>(IList<FromType> sources, IList<ToType> destinations);
oid AutoMap<FromType, ToType>(FromType from, ToType to);
}

将该接口(interface)注入(inject)您的 PrivateObject 并使用它代替 protected 方法。有了它,您将:

  1. 让你的类/方法遵循单一职责原则
  2. 独立测试映射
  3. 使用模拟来测试您的私有(private)类(class)

一般来说——每次很难编写单元测试时,通常这意味着类/方法做的太多了。

关于c# - 重载 protected 通用方法单元测试导致 AmbiguousMatchException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20704530/

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