2

我在项目中使用自定义属性,我想将它们集成到我的单元测试中。

现在我使用 Rhino Mocks 来创建我的模拟,但我没有看到将我的属性(和那里的参数)添加到它们的方法。

我错过了什么,还是不可能?其他模拟框架?还是我必须使用我的属性创建虚拟实现?

示例:我在插件架构(IPlugin)中有一个接口,并且有一个属性可以将元信息添加到属性。然后我在插件实现中查找具有此属性的属性以进行额外处理(存储其值,标记为 gui 只读...)

现在,当我创建模拟时,我可以轻松地将属性添加到属性或对象实例本身吗?

编辑:我发现了一个有同样问题的帖子 ->链接。答案不是 100%,而是 Java ......

编辑2:可以做到...搜索了更多(关于SO)并找到了2个相关问题(+答案)

这里这里

现在,这是否已经在一个或另一个模拟框架中实现了?

4

3 回答 3

1

这是我如何测试自定义属性的示例。在这种情况下,我有一个用于方法的自定义属性。在我的测试类中,我创建了一个应用自定义属性的占位符方法。然后我使用反射来获取自定义属性的实例。

[TestFixture] public class SomeRandomAttributeTest
{
    [SomeRandom(RestrictionType.Local)]
    public void PlaceholderMethodForAttribute() {throw new ApplicationException(this.ToString());}

    [Test]public void BlahBlahIsBlahTheBlah()
    {
        object[] attributes = this.GetType().GetMethod("PlaceholderMethodForAttribute").GetCustomAttributes(false);
        Assert.AreEqual(1, attributes.Length);
        Assert.IsInstanceOfType(typeof(SomeRandomAttribute), attributes[0]);

        Assert.AreEqual("Yada yada yada", ((SomeRandomAttribute) attributes[0]).Yada);

    }
}
于 2008-11-25T23:09:21.573 回答
1

为什么你不能这样做:

var sut = new SomeRandomAttribute(RestrictionType.Local);
Assert.AreEqual("Yada yada yada", sut.Yada);

如果您想测试访问所有类型的代码并为SomeRandomAttribute它找到的每个 's 做一些事情,我建议您将其拆分为检索用您的自定义属性装饰的 MethodInfo 对象和需要的操作对这些对象执行。给定正确配置的 MethodInfo 对象和属性,后者应该很容易测试。前者可以通过对您的属性使用特定的测试占位符来完成,如 Joseph 所建议的。

于 2009-03-17T23:46:45.947 回答
0

这取决于您需要测试的内容:

  • 测试属性的某些“功能”,如果您添加的属性对其装饰的类/方法有一些影响,您可以创建一个虚拟类,该类继承IPlugin与该属性并测试其行为是否受到属性存在的影响或价值。
  • 如果您想测试该属性的某些内部功能,则只需创建该属性并使用断言来验证该最终结果。

我认为你不需要在这里嘲笑。

于 2010-05-04T20:04:29.993 回答