【问题标题】:Mocking attributes - C#模拟属性 - C#
【发布时间】:2008-11-25 21:49:38
【问题描述】:

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

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

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

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

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

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

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

herehere

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

【问题讨论】:

标签: c# unit-testing attributes mocking


【解决方案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);

    }
}

【讨论】:

  • 但是我可以在模拟上附加这个属性,这样我就不必创建占位符了吗?看我的例子。
  • 啊啊啊我的眼睛!为了,将这些属性移到类/方法声明之上。
【解决方案2】:

为什么你不能这样做:

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

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

【讨论】:

  • 问题是有很多属性没有逻辑可以测试。有时它们只是标记。所以我在程序集中寻找 IPlugin 实现,创建一个实例并存储一些元数据/执行属性逻辑。我想用一个模拟在 LoadPluginTest(IPlugin mock) 中进行测试。
【解决方案3】:

这取决于你需要测试什么:

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

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

【讨论】:

  • 我确实想测试功能,而不是内部逻辑,但没有创建虚拟类的麻烦(我现在做的),所以使用模拟框架。但我认为没有其他选择......谢谢......
猜你喜欢
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多