- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的代码重载签名中测试(使用 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 方法。有了它,您将:
一般来说——每次很难编写单元测试时,通常这意味着类/方法做的太多了。
关于c# - 重载 protected 通用方法单元测试导致 AmbiguousMatchException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20704530/
我写了这段代码: MethodInfo method2 = typeof(IntPtr).GetMethod( "op_Explicit", Bind
using System; using System.Reflection; namespace A { interface IObjectWithId { TId Id { get;
我得到异常(exception): AmbiguousMatchException: ambiguous match found 当打开我的窗口时,XAML被解析。我有一个基本的ViewModel类。
我有以下(简化的)类(class): public abstract class BaseSite { public int SiteId { get; set; } public s
我正在尝试在我的代码重载签名中测试(使用 Moq)重载 protected 泛型方法: protected void AutoMap(IList sources
我正在寻找一种解决方案来访问类的“展平”(最低)属性值及其通过属性名称的反射派生的值。 即从 ClassB 或 ClassC 类型访问 Property1 或 Property2 : publi
我有两个名称相同但方法签名不同的 Controller 操作。它们看起来像这样: // // GET: /Stationery/5?asHtml=true [AcceptVer
我正在使用反射创建一个 lambda 函数。它适用于我尝试过的大多数项目,但是在其中一个属性上它一直抛出不明确的匹配异常。 代码如下所示。当它命中 Expression.PropertyOrField
我有两个名称相同但大小写不同的属性 Title 和 TITLE: public class Product { [Key] public Guid Id { get; set; }
昨天我在开发 Web 部件时遇到了一个问题(这个问题不是关于 webpart 而是关于 C#)。关于这个问题的背景很少。我有一个使用反射加载 WebPart 的代码,其中我得到了 AmbiguousM
当我使用 JSON.NET 在 LINQPad 中运行此代码时: var x = JObject.Parse( @"{ ""data"" : [ { ""id"" : ""bbab529e
我正在尝试获取 MethodInfo来自方法 TableExists所以我可以用一个类型来调用它。 该方法在 OrmLiteSchemaApi 中声明类(class)。有2个重载: public st
我正在开发一个有点简单的 InventoryTracker MVC5 应用程序,其中我在将 LocalDatabase 设置为 Seed() 时遇到了一些问题. 当我运行 update-databas
我是一名优秀的程序员,十分优秀!